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

kro*_*maz 2 c unsigned-integer long-integer

示例代码:

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

if (num1 > num2)
    printf("Num1 is greater\n");
else
    printf("Num2 is greater\n");
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 6

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

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

这正是您的示例中发生的事情:long并且unsigned long具有相同的等级,因此将signed long转换为unsigned long.

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

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

因此,结果是1- + ULONG_MAX-1等于ULONG_MAX.这就是为什么转换-1成的结果unsigned大于1.