为什么负长值大于正无符号长值?

时间:2018-04-01 01:05:49

标签: c long-integer unsigned-integer

示例代码:

long num1 = -1;
unsigned long num2 = 1;

if (num1 > num2)
    printf("Num1 is greater\n");
else
    printf("Num2 is greater\n");

为什么这会评估num1> num2为true而不是false?

3 个答案:

答案 0 :(得分:6)

这是C99标准第6.3.1.8节中描述的整数提升规则的结果:

  

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

这正是您的示例中发生的情况:longunsigned long具有相同的排名,因此签名的long会转换为unsigned long

由于-1无法表示为无符号,因此以下规则起作用:

  

当具有整数类型的值转换为除_Bool以外的另一个整数类型时,如果该值可以由新类型表示,则它将保持不变。否则,如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内。

因此,结果为1- + ULONG_MAX-1,等于ULONG_MAX。这就是将-1转换为unsigned的结果大于1的原因。

答案 1 :(得分:0)

在表达式中同时使用longunsigned long时,'long value is converted to无符号长. This results in the value -1 becoming the largest无符号long`值,大于1。

答案 2 :(得分:0)

您正在比较不同数据类型的两个变量,即& unsigned long

在这种情况下,在比较两个变量时,编译器隐式地将 num1 变量强化为 unsigned long ,因为不同数据类型的两个变量可以'可以比较。

因此, num1 正在转换为 65534 [65535 - 1]。

因此,您将获得 Num1更高