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**31
、2**31
和 1<<31
都将具有相同的数字位表示形式。 -2**31
的符号部分不是数字的按位表示的一部分。标志是分开的。
如果你尝试这个你可以看到这个:
>>> bin(5)
'0b101'
>>> bin(-5)
'-0b101'
您好,我对 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**31
、2**31
和 1<<31
都将具有相同的数字位表示形式。 -2**31
的符号部分不是数字的按位表示的一部分。标志是分开的。
如果你尝试这个你可以看到这个:
>>> bin(5)
'0b101'
>>> bin(-5)
'-0b101'