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