为什么负int大于unsigned int?

Sla*_*shr 41 c int unsigned signed

int main(void) 
{ 
     unsigned int y = 10; 
     int x = – 4; 
     if (x > y) 
        Printf("x is greater");
     else 
        Printf("y is greater"); 
     getch(); 
     return (0); 
} 

Output: x is greater
Run Code Online (Sandbox Code Playgroud)

我认为输出y会更大,因为它是无符号的.这背后的原因是什么?

Who*_*aig 45

因为int价值被提升为unsigned int.具体地0xFFFFFFFC在32位机,它作为上unsigned int4294967292比大得多10

C99 6.3.1.1-p2

如果int可以表示原始类型的所有值(由宽度限制,对于位字段),则该值将转换为int; 否则,它将转换为unsigned int.这些被称为整数促销.整数促销不会更改所有其他类型.

要执行转换:

C99 6.3.1.3-p2

否则,如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.

这基本上意味着"添加UINT_MAX + 1"(无论如何我读它).

关于为什么促销是在unsigned int一边; 优先级:

C99 6.3.1.8-p1

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

否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型.

还告诉我,intunsigned char应该按预期工作.

测试

int main()
{
    int x = -4;
    unsigned int y = 10;
    unsigned char z = 10;

    if (x > y)
        printf("x>y\n");
    else
        printf("x<y\n");

    if (x > z)
        printf("x>z\n");
    else
        printf("x<z\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产量

x>y
x<z
Run Code Online (Sandbox Code Playgroud)

好吧,看看那个.

  • 相关部分实际上是**6.3.1.8通常的算术转换**.它表示"...否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的等级,则带有符号整数类型的操作数将转换为具有无符号整数的操作数的类型类型." (`int`和`unsigned int`具有相同的等级). (6认同)

glg*_*lgl 11

有符号和无符号值之间的比较将在"无符号空格"中进行.即,签名值将通过添加转换为无符号UINT_MAX + 1.在使用负补偿的2补码的实现中,在引擎盖下不需要对值进行特殊处理.

在这个例子中,-4被变成0x100000000-4= 0xFFFFFFFC这显然> 10.

  • 在继续努力得到答案的同时获得投票是很棒的......并且没有注意到downvoter认为错误的是什么 (2认同)