按位不操作如何给出负值

How does bitwise not operation give negative value

本文关键字:操作      更新时间:2023-10-16

我想通过一个简单的例子看看按位 NOT 是如何工作的:

int x = 4;
int y;
int z;
y = ~(x<<1);
z =~(0x01<<1);
cout<<"y = "<<y<<endl;
cout<<"z = "<<z<<endl;

这会导致y = -9z = -3。我不明白这是怎么发生的。有人可以教育我一点吗?

(x<<1)会将位移位,因此

00000000 00000000 00000000 00000100

将成为:

00000000 00000000 00000000 00001000

这是8的表示.然后~将反转所有位,使其变为:

11111111 11111111 11111111 11110111

这是-9的表示。


0x01

00000000 00000000 00000000 00000001

在二进制中,所以当移位一次变成:

00000000 00000000 00000000 00000010

然后当应用~时,我们得到:

11111111 11111111 11111111 11111101

哪个在二进制中-3

嗯,背后有一个很长的故事。
为了更容易理解,让我们使用二进制数。

x = 4x = 0b 0000 0000 0000 0000 0000 0000 0000 0100因为sizeOf(int) = 4
x<<1 x = 0b 0000 0000 0000 0000 0000 0000 0000 1000之后和之后
~(x<<1) x = 0b 1111 1111 1111 1111 1111 1111 1111 0111 .

这里开始复杂化。由于int是有符号类型,这意味着第一个位是一个符号,整个系统是两个完整的。

所以x = 0b 1111 1111 1111 1111 1111 1111 1111 0111 x = -9
例如 x = 0b 1111 1111 1111 1111 1111 1111 1111 1111 x = -1x = 0b 0000 0000 0000 0000 0000 0000 0000 0010 2

详细了解 Two complemnt。

无论整数是正数还是负数(整数的符号(都存储在专用位中,即符号位。按位 NOT 也会影响此位,因此任何正数都变为负数,反之亦然。

请注意,"专用位">

有点过于简单化,因为大多数现代计算机不使用"符号和幅度"表示(符号位只会切换符号(,而是使用"二的补码"表示,其中符号位也会影响大小。

例如,8 位有符号整数00000000为 0,但10000000(符号位翻转(将为 -128。