python3: ~2 = -0b11?

python3: ~2 = -0b11?

运行以下python3

>>> print(2, bin(2), ~2, bin(~2))
> 2 0b10 -3 -0b11

我认为~2应该是0b010b101

为什么 -0b11

先看~2:

 2 = 0b0000...10 (n leading 0s)
~2 = 0b1111...01 (n leading 1s)

然后分析-0b11

大多数计算机数字表示使用补码表示法,其中:

A - B = A + ~B + 1

所以 -0b11 实际上是:

  - 0b11
= 0 - 0b11
= 0b0000...00 + 0b1111...00 + 1
= 0b1111...01
 2  = 00000010
~2  = 11111101

11111101 的二进制补码是多少?

要回答这个问题,请遵循这个简单的算法:

  • 翻转所有位
  • 结果加 1
  • 根据MSB判断符号

11111101 > 00000010 > 00000011 
         ^          ^ 
       Flip       Add 1

注意最高位是“1”,所以符号是负数