0

以下程序给出的输出为-56。我手动跟踪它-14二进制等价物是00001110,它的2的补码是11110001左移2位我得到11000100。我怎么能把它解释为-56。谢谢你。

#include<stdio.h>

main()

{
int i=-14;
i<<=2;
printf("%d",i);
}
4

4 回答 4

2

减 14 应该是 11110010。左移 2 位,得到 11001000。

假设二进制补码,要将其转换为正数,我们将所有位取反,得到 00110111,然后加 1,得到 00111000。即 8+16+32 = 56。

于 2013-10-06T06:17:40.533 回答
2

因为左移一个负数是未定义的行为。

除此之外:你知道你的假设只有在int一个字节/八位长的情况下才是正确的?不太可能(特别是因为标准要求它至少为 16 位宽)。

于 2013-10-06T06:16:46.880 回答
1

你原来的前提是错误的。

二进制补码中的 -14 不是 11110001,而是 11110010。

因此,当我们对它进行位移时,我们最终得到 11001000,即 -56。至少在 Linux 上带有 gcc 的 Intel CPU 上。YMMV。

于 2013-10-06T06:16:47.560 回答
0

十四是 00001110(坚持八位)。1 的补码是 11110001。您需要为 2 的补码增加它:11110010。(提示:负 14 是偶数。最低有效位应该为零。)

现在左移两个位置。11110010 变为 11001000。仍然是负值(设置了大多数 sig. 位)所以让我们用 2 来补充它。首先,翻转 1 的补码的所有位:00110111。现在递增:00111000。这是 56。请注意,它只是起始数字,即此答案中的第三个“单词”,移动了两个位置。一切都很顺利,不是吗?

于 2013-10-06T06:18:02.590 回答