我在《计算机系统:程序员的视角,第二版》一书中看到了以下代码。该代码正常工作并创建所需的输出。输出可以通过有符号和无符号表示的差异来解释。
上述代码生成
产生了
请注意,我看到过类似的问题,例如这个问题,但它们并没有帮助。
PS。正如@Abhineet所说,将
在小端Intel系统上的示例输出:
对于短整型:
#include<stdio.h>
int main() {
if (-1 < 0u) {
printf("-1 < 0u\n");
}
else {
printf("-1 >= 0u\n");
}
return 0;
}
上述代码生成
-1 >= 0u
,然而下面的代码应该是相同的,但实际上并不相同!换句话说,#include <stdio.h>
int main() {
unsigned short u = 0u;
short x = -1;
if (x < u)
printf("-1 < 0u\n");
else
printf("-1 >= 0u\n");
return 0;
}
产生了
-1 < 0u
的结果,这是为什么呢?我无法解释这个问题。请注意,我看到过类似的问题,例如这个问题,但它们并没有帮助。
PS。正如@Abhineet所说,将
short
改为int
可以解决这个困境。然而,如何解释这个现象呢?换句话说,在4字节中,-1
是0xff ff ff ff
,在2字节中是0xff ff
。以二进制补码的形式给出,它们分别被解释为unsigned
,它们具有相应的值4294967295
和65535
。它们都不小于0
,我认为在两种情况下,输出都需要-1 >= 0u
,即x >= u
。在小端Intel系统上的示例输出:
对于短整型:
-1 < 0u
u =
00 00
x =
ff ff
对于int类型:
-1 >= 0u
u =
00 00 00 00
x =
ff ff ff ff