为什么unsigned int 1低于char y -1?

Fur*_*qan 8 c

main() {
    unsigned x = 1;
    char y = -1;

    if (x > y)
        printf("x>y");
    else
        printf("x<=y");
}
Run Code Online (Sandbox Code Playgroud)

我期待x> y.但当我将unsigned int更改为signed int时,我得到了预期的结果.

nin*_*alj 15

如果char相当于signed char:

  • char被提升为int(整数促销,ISOC99§6.3.1.12)
  • 由于intunsigned int具有相同的等级,int转换为unsigned int(算术转换,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 int,另一种是unsigned int.第一个操作数转换为unsigned int.

整数提升:int转换为intif 的较低级别的表达式,否则int可以保存原始类型的所有值unsigned int.

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

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

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

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

  • +1详细而正确的答案。(而且因为当接受的答案错误时,我几乎总是对体面的正确答案+1。) (2认同)