不理解按位一元反转的方式' 〜'操作员工作

时间:2015-03-30 19:20:00

标签: c++ c bit-manipulation

int x=10;
cout<<~x;

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

3 个答案:

答案 0 :(得分:4)

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

作为旁注,“int”是16位或32位,所以你实际上是在谈论 分别为“00000000 00001010”或“00000000 00000000 00000000 00001010”。

答案 1 :(得分:2)

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

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

N位数 w 以2的补码表示为 a N-1 a N-2 .... 0 可以转换为十进制为

enter image description here

因此,

1111 0101 2 = -1 * 2 7 1 * 2 6 + 1 * 2 5 + 1 * 2 4 + 0 * 2 3 + 1 * 2 2 + 0 * 2 1 + 1 * 2 0 = -128 + 117 = -11

答案 2 :(得分:0)

〜运算符可以按照您的想法运行。只是负面数字不会影响你的想法。负数被编码为两个补码http://en.wikipedia.org/wiki/Two%27s_complement

基本上,从较低位的值中减去最高位的值。