<分区>
我对移位后的否定操作感到困惑。 例如:
-(1<<7) is 0xffffff80
但为什么最高有效位都用 1 填充呢?
我对操作的内容感到困惑-
意思是这里。
编辑 1:我使用了 printf("%#08x\n", -(1<<7))
打印出值。
标签 c
<分区>
我对移位后的否定操作感到困惑。 例如:
-(1<<7) is 0xffffff80
但为什么最高有效位都用 1 填充呢?
我对操作的内容感到困惑-
意思是这里。
编辑 1:我使用了 printf("%#08x\n", -(1<<7))
打印出值。
最佳答案
首先,谢谢你提出这个问题。通常最好编写一个测试程序来说明您不确定的事情,然后尝试不同的事情来找出细节。
像 UB 这样的评论通常是不准确的。在这种情况下,发生的事情是非常可预测和合理的,这正是有经验的程序员应该期望的。
我在 Eclipse/Microsoft C 编译器上运行了以下代码:
#include <stdio.h>
main()
{
int i;
unsigned int j;
i = -(1<<7);
printf("%i\n", i);
printf("%08x\n", i);
j = -(1<<7);
printf("%u\n", j);
printf("%08x\n", j);
}
得到如下输出:
-128
ffffff80
4294967168
ffffff80
这些是预期的,因为:(1 << 7) 等于 128 并且 -(128) 是 -128。 i 的内容的 printf
以二进制形式精确地产生了 -128 的值。
看这个的方法是取 ffffff80 = 0000007f + 1 = 00000080 的 2 的补码,二进制为 128。因此,您可以看到取一个数的 2 的补码就是取整数的负数。
真正大的数是相同内容的无符号值。
尽可能编写一些代码来检查这些东西是如何工作的!
关于C语言 : left shift value with negative sign,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18386848/