CPython-Internals
CPython-Internals copied to clipboard
关于long类型的理解存在疑点
根据你的文档BasicObject/long,我使用64位版本的Python 3.9.12进行验证。 验证代码如下
import ctypes
data = 0
for index in range(50):
data = data * 2 + 1
data_id, hex_list = id(data) + 24, []
for byte_index in range(8):
hex_list.append(ctypes.c_ubyte.from_address(data_id + byte_index).value)
hex_list = ["{:02x}".format(item) for item in hex_list]
print("{:064b}".format(data), " ".join(hex_list))
其对应的输出结果为
0000000000000000000000000000000000000000000000000000000000000001 01 00 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000000000000000011 03 00 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000000000000000111 07 00 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000000000000001111 0f 00 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000000000000011111 1f 00 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000000000000111111 3f 00 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000000000001111111 7f 00 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000000000011111111 ff 00 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000000000111111111 ff 01 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000000001111111111 ff 03 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000000011111111111 ff 07 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000000111111111111 ff 0f 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000001111111111111 ff 1f 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000011111111111111 ff 3f 00 00 00 00 00 00
0000000000000000000000000000000000000000000000000111111111111111 ff 7f 00 00 00 00 00 00
0000000000000000000000000000000000000000000000001111111111111111 ff ff 00 00 00 00 00 00
0000000000000000000000000000000000000000000000011111111111111111 ff ff 01 00 00 00 00 00
0000000000000000000000000000000000000000000000111111111111111111 ff ff 03 00 00 00 00 00
0000000000000000000000000000000000000000000001111111111111111111 ff ff 07 00 00 00 00 00
0000000000000000000000000000000000000000000011111111111111111111 ff ff 0f 00 00 00 00 00
0000000000000000000000000000000000000000000111111111111111111111 ff ff 1f 00 00 00 00 00
0000000000000000000000000000000000000000001111111111111111111111 ff ff 3f 00 00 00 00 00
0000000000000000000000000000000000000000011111111111111111111111 ff ff 7f 00 00 00 00 00
0000000000000000000000000000000000000000111111111111111111111111 ff ff ff 00 00 00 00 00
0000000000000000000000000000000000000001111111111111111111111111 ff ff ff 01 00 00 00 00
0000000000000000000000000000000000000011111111111111111111111111 ff ff ff 03 00 00 00 00
0000000000000000000000000000000000000111111111111111111111111111 ff ff ff 07 00 00 00 00
0000000000000000000000000000000000001111111111111111111111111111 ff ff ff 0f 00 00 00 00
0000000000000000000000000000000000011111111111111111111111111111 ff ff ff 1f 00 00 00 00
0000000000000000000000000000000000111111111111111111111111111111 ff ff ff 3f 00 00 00 00
0000000000000000000000000000000001111111111111111111111111111111 ff ff ff 3f 01 00 00 00
0000000000000000000000000000000011111111111111111111111111111111 ff ff ff 3f 03 00 00 00
0000000000000000000000000000000111111111111111111111111111111111 ff ff ff 3f 07 00 00 00
0000000000000000000000000000001111111111111111111111111111111111 ff ff ff 3f 0f 00 00 00
0000000000000000000000000000011111111111111111111111111111111111 ff ff ff 3f 1f 00 00 00
0000000000000000000000000000111111111111111111111111111111111111 ff ff ff 3f 3f 00 00 00
0000000000000000000000000001111111111111111111111111111111111111 ff ff ff 3f 7f 00 00 00
0000000000000000000000000011111111111111111111111111111111111111 ff ff ff 3f ff 00 00 00
0000000000000000000000000111111111111111111111111111111111111111 ff ff ff 3f ff 01 00 00
0000000000000000000000001111111111111111111111111111111111111111 ff ff ff 3f ff 03 00 00
0000000000000000000000011111111111111111111111111111111111111111 ff ff ff 3f ff 07 00 00
0000000000000000000000111111111111111111111111111111111111111111 ff ff ff 3f ff 0f 00 00
0000000000000000000001111111111111111111111111111111111111111111 ff ff ff 3f ff 1f 00 00
0000000000000000000011111111111111111111111111111111111111111111 ff ff ff 3f ff 3f 00 00
0000000000000000000111111111111111111111111111111111111111111111 ff ff ff 3f ff 7f 00 00
0000000000000000001111111111111111111111111111111111111111111111 ff ff ff 3f ff ff 00 00
0000000000000000011111111111111111111111111111111111111111111111 ff ff ff 3f ff ff 01 00
0000000000000000111111111111111111111111111111111111111111111111 ff ff ff 3f ff ff 03 00
0000000000000001111111111111111111111111111111111111111111111111 ff ff ff 3f ff ff 07 00
0000000000000011111111111111111111111111111111111111111111111111 ff ff ff 3f ff ff 0f 00
其结果表明了在int的存储范围中(4个字节),其最大能记录的数据是(1<<30) -1,32位比特的前两位作为特殊用途保留下来。而非你文档所说的(1个保留位+15个数据位)*N组,请作者重新验证后给予回复,谢谢