int x=10;
cout<<~x;
此代码打印-11。如果它是简单的反转,则00001010的位应为11110101,转换为十进制时为-117。我试过搜索但没有运气请告诉我这里发生了什么? 我正在使用mingw编译器,如果它有任何帮助。
答案 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 可以转换为十进制为
因此,
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
基本上,从较低位的值中减去最高位的值。