为什么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)
  • 由于intunsigned具有相同的等级,因此int被转换为unsigned (算术转换,ISOC99§6.3.1.8)

如果char等同于unsigned char

  • char可以被提升为intunsigned int
    • 如果int可以表示所有unsigned char值(通常是因为sizeof(int) > sizeof(char) ),则char将转换为int
    • 否则(通常因为sizeof(char)==sizeof(int) ), char被转换为unsigned
  • 现在我们有一个操作数是intunsigned ,另一个是unsigned 。 第一个操作数转换为unsigned

整数提升:一种较低等级的表达式,如果int可以保存原始类型的所有值,则int转换为int ,否则为unsigned

算术转换:尝试转换为更大的类型。 当有符号和无符号之间存在冲突时,如果较大(包括两种类型具有相同等级的情况)类型是无符号的,则使用无符号。 否则,只有在可以表示两种类型的所有值的情况下才使用signed。

转换为整数类型(ISOC99§6.3.1.3):

将超出范围的值转换为无符号整数类型是通过环绕(模运算)完成的。

将超出范围的值转换为有符号整数类型是实现定义的,并且可以引发信号(例如SIGFPE)。

在单个操作中使用signed和unsigned时,signed通过C的自动类型转换被提升为unsigned。 如果-1的位模式被认为是无符号数,则它是非常高的值。 所以x > y是假的。