CPython-Internals icon indicating copy to clipboard operation
CPython-Internals copied to clipboard

关于long类型的理解存在疑点

Open NB-Dragon opened this issue 7 months ago • 0 comments

根据你的文档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组,请作者重新验证后给予回复,谢谢

NB-Dragon avatar Jul 03 '24 17:07 NB-Dragon