不了解按位一元反转“~”运算符的工作原理
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
基本上就是用低位的值减去最高位的值。
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
基本上就是用低位的值减去最高位的值。