【发布时间】:2015-10-26 06:47:15
【问题描述】:
我在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。为什么会这样?我无法解释。
请注意,我见过类似的问题,例如 this,但它们没有帮助。
PS。正如@Abhineet 所说,可以通过将short 更改为int 来解决困境。然而,如何解释这种现象呢?换句话说,4 个字节中的-1 是0xff ff ff ff,2 个字节中是0xff ff。给定它们作为 2s-complement 被解释为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
【问题讨论】:
-
C 根据值而不是表示来表现。所有关于 2 的补码和 ffff 和 65535 等的东西都是无关紧要的。
-
不要对非代码文本使用代码格式。
标签: c bit-manipulation twos-complement unsigned-integer integer-promotion