因为int
值被提升为unsigned int
. 特别0xFFFFFFFC
是在一个 32 位机器上,它作为一个unsigned int
,4294967292
比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
...否则,如果无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型。
否则,如果有符号整数类型的操作数的类型可以表示无符号整数类型的操作数的所有值,则将无符号整数类型的操作数转换为有符号整数类型的操作数的类型。
这告诉我int
vs.unsigned 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;
}
输出
x>y
x<z
看看那个。