main() {
unsigned x = 1;
char y = -1;
if (x > y)
printf("x>y");
else
printf("x<=y");
}
我期待x>y
,
但我必须将unsigned int
更改为signed int
才能获得预期的结果。
答案 0 :(得分:15)
如果char
等同于signed char
:
char
被提升为int
(整数促销,ISOC99§6.3.1.1¶2)int
和unsigned int
具有相同的排名,int
将转换为unsigned int
(算术转换,ISOC99§6.3.1.8)如果char
等同于unsigned char
:
char
可以升级为int
或unsigned int
:
int
可以代表所有unsigned char
值(通常是因为sizeof(int) > sizeof(char)
),char
会转换为int
。sizeof(char)==sizeof(int)
),char
会转换为unsigned
。int
或unsigned int
,另一个是unsigned int
。第一个操作数转换为unsigned int
。整数促销:
如果int
可以将原始类型的所有值保存为int
,则int
转换为unsigned int
的较低等级的表达式,否则为{{1}}。
算术转换: 尝试转换为更大的类型。当有符号和无符号之间存在冲突时,如果较大(包括两种类型具有相同等级的情况)类型是无符号的,则使用无符号。否则,只有在可以表示两种类型的所有值的情况下才使用signed。
转换为整数类型(ISOC99§6.3.1.3):
将超出范围的值转换为无符号整数类型是通过环绕(模运算)完成的。
将超出范围的值转换为有符号整数类型是实现定义的,并且可以引发信号(例如SIGFPE)。
答案 1 :(得分:3)
在单个操作中使用signed和unsigned时,signed的自动类型转换将提升为unsigned。如果-1
的位模式被认为是无符号数,则它是非常高的值。所以x > y
是假的。