按位非操作如何给出负值

How does bitwise not operation give negative value

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

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

这导致 y = -9z = -3。我不明白这是怎么发生的。谁能教教我一下?

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

请注意,"dedicated bit" 有点过于简单化了,因为大多数当代计算机 而不是 使用 "sign and magnitude" 表示(其中符号位只会切换符号),但 "two's complement" 表示,其中符号位也会影响大小。

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

(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 是有符号类型,这意味着第一位是一个符号,整个系统是 Two complemnt.

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

了解更多关于二次元的信息。