C中的有符号整数

Ang*_*gus 3 c

#include<stdio.h>

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

上面的代码输出>6.但我怀疑了.在执行2的补码之后b=-20将保持负值(-18),因为它是有符号整数.所以它应该输出,<=6但它给出一个输出>6.

Oli*_*rth 9

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

如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型.

基本上,在您的示例代码的情况下,unsigned intint具有相同的排名,所以它相当于:

(a + (unsigned int)b > 6)
Run Code Online (Sandbox Code Playgroud)

要修复它,您需要明确地向另一个方向投射,即:

((int)a + b > 6)
Run Code Online (Sandbox Code Playgroud)