为什么 ~True 的结果是 -2



在 Python 控制台中:

~True

给我:

-2

为什么?有人可以用二进制向我解释这个特殊情况吗?

int(True) 1 .

1是:

00000001

~1是:

11111110

这在 2 的补码1-2

1

翻转所有位,将结果数字加 1,并将结果解释为幅度的二进制表示并添加负号(因为数字以 1 开头):

11111110 → 00000001 → 00000010 
         ↑          ↑ 
       Flip       Add 1

这是 2,但符号为负,因为 MSB 为 1。


值得一提的是:

想想bool,你会发现它本质上是数字的——它有两个值,TrueFalse,它们只是整数 1 和 0 的"定制"版本,只是打印自己不同。它们是整数类型 int子类

因此,它们的行为与 1 和 0 完全相同,只是bool重新定义了strrepr以不同的方式显示它们。

>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True
>>> True == 1
True
>>> True is 1  # they're still different objects
False
Python

bool 类型是 int 的一个子类(由于历史原因;布尔值仅在 Python 2.3 中添加)。

由于int(True)1~True~1-2

请参阅 PEP 285 了解为什么 boolint 的子类。

如果你想要布尔反转,请使用not

>>> not True
False
>>> not False
True

如果你想知道为什么~1-2,那是因为你反转了有符号整数中的所有位; 00000001变成有符号整数中的负数1111110,请参阅 Two 的补码:

>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'

其中,初始1位表示值为负,其余位编码正数减一的倒数。

如果

True表示1~表示按位反转~True == -2也就不足为奇了......

前提是

  • True可以被视为整数和
  • 整数用 Two 的补码表示

编辑:

  • 修复了整数表示和按位反转运算符之间的混合
  • 应用了另一次润色(消息越短,需要的工作越多)

最新更新