C语言 : left shift value with negative sign

标签 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/

相关文章:

c - 我该如何像动画一样在c中移动字母

c - 来自两个 3D 点的平面方程以及该平面与点之间的垂直距离

c - 在文本文件中读取错误的整数

c - FCFS vs SJF vs RR

c - 防止 exe 文件关闭

c - 欧拉项目 - 问题 22 : Answer off by 3. 35%

c - 缓冲区溢出攻击分段故障(核心转储)

c - 为什么这个 fork() 输出产生 8 而不是 5?

c - 什么时候在 C 中未定义指针减法?

c - fwrite 非 ASCII 字符