Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么负长值大于正无符号长值?_C_Long Integer_Unsigned Integer - Fatal编程技术网

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该标准允许您混合使用有符号和无符号,只要您理解并遵循语言标准定义的规则。代码不容易理解,但完全由标准定义。