python 中的位表示

bit representation in python

您好,我对 python

中的位表示有疑问

当我使用位运算1<<31时,可以看到位是

1000 0000 0000 0000 0000 0000 0000 0000

python 会将此值打印为 2147483648

但是当我给出一个像 a = -2**31

这样的变量值时

比特也是

1000 0000 0000 0000 0000 0000 0000 0000

但是python会打印-2147483648

所以如果位相同,python 如何决定使用 2147483648 或 -2147483648?

表现形式并不完全相同。您可以使用 int.to_bytes 来检查它:

(1 << 31).to_bytes(32, 'big', signed=True)

b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00'

(-2 ** 31).to_bytes(32, 'big', signed=True)

b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00'

此外,请注意 - 运算符,这里的优先级较低:

-2 ** 31 == -(2 ** 31)

在 python 中,整数没有精度限制。这意味着,除其他事项外,数字不存储在二进制补码中。符号未存储在数字的位表示中。

因此所有 -2**312**311<<31 都将具有相同的数字位表示形式。 -2**31 的符号部分不是数字的按位表示的一部分。标志是分开的。

如果你尝试这个你可以看到这个:

>>> bin(5)
'0b101'
>>> bin(-5)
'-0b101'