我在Computer Systems: A Programmer's Perspective, 2/E 一书中看到了以下代码。这很好用并创建了所需的输出。输出可以通过有符号和无符号表示的差异来解释。
#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
. 然而,如何解释这种现象呢?换句话说,-1
在 4 个字节中是0xff ff ff ff
,在 2 个字节中是0xff ff
。给定它们作为被解释为 的 2s 补码,它们具有和unsigned
的对应值。它们都不少于,我认为在这两种情况下,输出都必须是,即。4294967295
65535
0
-1 >= 0u
x >= u
在小端英特尔系统上的示例输出:
简而言之:
-1 < 0u
u =
00 00
x =
ff ff
对于整数:
-1 >= 0u
u =
00 00 00 00
x =
ff ff ff ff