猪宝宝问题(有符号 无符号类型 整形提升)

问题描述:

int main()
{
	unsigned = 1;//无符号
	signed char y = -1;//有符号
	if (x > y)
		printf("x>y\n");
	else
		printf("y>x\n");
	system("pause");
	return 0;
}
int main()
{
	unsigned int x = 1;//无符号
	signed char y = -1;//有符号
	if (x > y)
		printf("x>y\n");
	else
		printf("y>x\n");
	system("pause");
	return 0;
}
int main()
{
	unsigned char x = 1;//无符号
	signed char y = -1;//有符号
	if (x > y)
		printf("x>y\n");
	else
		printf("y>x\n");
	system("pause");
	return 0;
}

输出结果分别会是什么

unsigned x = 1;//无符号
signed char y = -1;//有符号         
对应结果: x < y;

unsigned int x = 1;//无符号
signed char y = -1;//有符号         
对应结果: x < y;


unsigned char x = 1;//无符号
signed char y = -1;//有符号         
对应结果: x > y

分析:
在有符号类型与无符号类型数据进行比较时,vs会警告:有符号/无符号不匹配,但不会报错。
首先vs默认unsigned 类型为unsigned int类型所以结果 1 和 2 相同。

1.unsigned int类型与其他类型如unsigned short,signed short,unsigned char, char 比较时,其他类型一律转化为无符号int类型来比较

unsigned int x = 1;//无符号
signed char y = -1;//有符号         
对应结果: x < y;

故signed char发生整型提升:整型提升看自身类型 y = -1 二进制补码为1111 1111
发生整型提升后为11111111 11111111 11111111 11111111 对应类型为unsigned int
故结果为 x<y

2.非int类型比较(不论有无符号)如unsigned short,signed short,unsigned char, char 比较时,一律转化为int类型(有符号的int)来比较

unsigned char x = 1;//无符号
signed char y = -1;//有符号         
对应结果: x > y

x整型提升后为00000000 00000000 00000000 00000001(补码)
y整型提升后为111111111 111111111 111111111 111111111 (补码)
对应类型都是 int型
故x>y;

总结:
1.无符号int与有符号int比较大小,转化为无符号int来比较
2.int类型与非无符号int的类型比较时,非无符号int的类型转化为int来比较
3.无符号int类型与其他类型如unsigned short,signed short,unsigned char, char 比较时,其他类型一律转化为无符号int类型来比较
4.非无符号int类型和非int类型如unsigned short,signed short,unsigned char, char 比较时,一律转化为int类型来比较

发布了89 篇原创文章 · 获赞 11 · 访问量 5336

猜你喜欢

转载自blog.csdn.net/weixin_44997886/article/details/102635313