C 为什么负长值大于正无符号长值?
示例代码:C 为什么负长值大于正无符号长值?,c,long-integer,unsigned-integer,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?这是C99标准第6.3.1.8节中描述的整数提升规则的结果: 如果具有无符号整数类型的操作数的秩大于或等于 等于另一个操作数类型的秩,然后为 有符号整数类型转换为
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?这是C99标准第6.3.1.8节中描述的整数提升规则的结果: 如果具有无符号整数类型的操作数的秩大于或等于 等于另一个操作数类型的秩,然后为 有符号整数类型转换为无符号的操作数类型 整数类型 这正是您的示例中发生的情况:
long
和unsigned long
具有相同的秩,因此有符号的long
将转换为unsigned long
由于-1
不能表示为未签名,因此以下规则起作用:
当整数类型的值转换为除\u Bool
以外的其他整数类型时,如果该值可以用新类型表示,则该值不变。否则,如果新类型是无符号的,则会通过重复地将新类型中可以表示的最大值加上或减去一个值来转换该值,直到该值在新类型的范围内
因此,结果是
1-+ULONG_MAX-1
,等于ULONG_MAX
。这就是为什么将-1
转换为unsigned
的结果大于1
当在表达式中同时使用long
和unsigned long
时,“long值将转换为unsigned long。这导致值-1成为最大的
unsigned long`值,大于1。您正在比较不同数据类型的两个变量,即long&unsigned long。
在这种情况下,在比较两个变量时,编译器将隐式类型转换变量num1到无符号长,因为无法比较不同数据类型的两个变量
因此,num1正在转换为65534[65535-1]
因此,您将得到Num1更大不要混合使用有符号和无符号@DeiDei该标准允许您混合使用有符号和无符号,只要您理解并遵循语言标准定义的规则。代码不容易理解,但完全由标准定义。