C中的有符号整数

时间:2011-08-28 18:06:46

标签: c

#include<stdio.h>

int main()
{
    unsigned int a=6;
    int b=-20;
    (a+b>6)?puts(">6"):puts("<=6");
    return 0;
}

以上代码输出>6。但我怀疑了。 b=-20将保留负值(-18) 在做2的补码后,因为它是有符号整数。所以它应该输出<=6但是它 输出为>6

3 个答案:

答案 0 :(得分:9)

根据C99标准,第6.3.1.8节(“常用算术转换”):

  

如果具有无符号整数类型的操作数的等级大于或等于   等于另一个操作数的类型的等级,然后是操作数   带符号整数类型转换为操作数的类型   无符号整数类型。

基本上,对于示例代码,unsigned intint具有相同的排名,因此它等同于:

(a + (unsigned int)b > 6)

要修复它,你需要明确地转向另一个方向,即:

((int)a + b > 6)

答案 1 :(得分:1)

答案可以在C99标准的“6.3.1.8常用算术转换”一节中找到,当有符号类型和无符号类型被传递给二元运算符时,它有利于无符号类型(现实更为微妙)比那个)。

有关完成6.3.1.8中规则的另一个示例,请参阅this blog post

答案 2 :(得分:1)

您在代码中混合了有符号和无符号整数。这是一个坏事。请尝试以下代码段:

int main()
{
    unsigned int a = 0;
    int b=-20;
    printf("(a + b) = %f", (a + b));
    return 0;
}

不要混合有符号和无符号整数,因为编译器会在你不想要的时候进行静默转换。