不了解按位一元反转“~”运算符的工作原理

Not understanding how the bitwise unary inversion ' ~ ' operator works

int x=10;
cout<<~x;

此代码打印 -11。如果它是简单的反转那么对于 00001010 位应该是 11110101,转换为十进制是 -117。我试过搜索但没有运气请告诉我这里发生了什么? 我正在使用 mingw 编译器,如果它有任何帮助。

~x 等于 −x − 1。因此,~10 = -10 - 1 = -11

使用1字节,10表示为0000 1010。它的按位 NOT 是 1111 0101。通常计算机以 2 的补码格式表示有符号整数。所以,1111 0101 的十进制等价于 -11,怎么样?

一个N位数w,用2的补码表示为aN-1aN-2.....a0可以转换为十进制为

因此,

1111 01012 = -1*27 1*26 + 1 *25 + 1*24 + 0*23 + 1*22 + 0*21 + 1*20 = -128 + 117 = -11

这按预期工作。 “11110101”是 -11 的补码。

附带说明,"int" 是 16 位或 32 位,所以您实际上是在谈论 分别为“00000000 00001010”或“00000000 00000000 00000000 00001010”。

~ 运算符的工作原理如您所想。只是负数并不像您认为的那样起作用。负数被编码为二进制补码 http://en.wikipedia.org/wiki/Two%27s_complement

基本上就是用低位的值减去最高位的值。