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

时间:2011-07-02 07:27:41

标签: c

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

    if (x > y)
        printf("x>y");
    else
        printf("x<=y");
}

我期待x>y, 但我必须将unsigned int更改为signed int才能获得预期的结果。

2 个答案:

答案 0 :(得分:15)

如果char等同于signed char

  • char被提升为int(整数促销,ISOC99§6.3.1.1¶2)
  • 由于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可以将原始类型的所有值保存为int,则int转换为unsigned int的较低等级的表达式,否则为{{1}}。

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

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

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

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

答案 1 :(得分:3)

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