问题描述:
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类型来比较