Python Decimal的内存结构

在这里插入图片描述
decimal与float的不同,decimal的字面量是字符串,存储是将符号、小数点位置、去掉小数点的十进制整数为架构的。而且虽然数据区存储的十进制还是hex模式,但设计上都符合人的十进制思维,10000000000000000000进入下一区块,区块间是10000000000000000000进制。因为10000000000000000000*10则一个区块盛不下。
一千万万亿

之前并不知道区块进位这一说,所以先是暴力增加,再到优化后的增加。回头想,直接用HxD修改岂不美哉!

而float是以二进制为基础存储的。

import ctypes,decimal

# for i in range(0x8000000000000000,0x8fffffffffffffff):
#     d=decimal.Decimal(i)
#     if i.to_bytes(length=8, byteorder='little')!=ctypes.string_at(id(d)+72,8):break

t=i=s=0x8ac7200000000000
sep=0x100000000000
while 1:
    for i in range(s,0xffffffffffffffff,sep):
        d=decimal.Decimal(i)
        if i.to_bytes(length=8, byteorder='little')!=ctypes.string_at(id(d)+72,8):break
        t=i
    s=t
    if sep==1:break
    sep=int(sep/16)
    print(hex(i))

0x8ac7230489e80000
Out[283]: 10000000000000000000

0x8ac7230489e80000-1
Out[284]: 9999999999999999999

mem.data(decimal.Decimal(9999999999999999999))
ff ff ff ff ff ff ff ff 30 ff ff ff ff ff ff ff
00 00 00 00 00 00 00 00 13 00 00 00 00 00 00 00
01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00
18 aa 05 39 86 02 00 00 ff ff e7 89 04 23 c7 8a
20 27 70 72 65 5f 72 75 6e 5f 63 6f 64 65 5f 68
6f 6f 6b 27 00 00 00 00

mem.data(decimal.Decimal(10000000000000000000))
ff ff ff ff ff ff ff ff 30 ff ff ff ff ff ff ff
00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00
02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00
98 ad 05 39 86 02 00 00 00 00 00 00 00 00 00 00
01 00 00 00 00 00 00 00 6e 5f 63 6f 64 65 5f 68
6f 6f 6b 27 00 00 00 00

mem.data(decimal.Decimal(20000000000000000000))
ff ff ff ff ff ff ff ff 30 ff ff ff ff ff ff ff
00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00
02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00
98 ad 05 39 86 02 00 00 00 00 00 00 00 00 00 00
02 00 00 00 00 00 00 00 6e 5f 63 6f 64 65 5f 68
6f 6f 6b 27 00 00 00 00

mem.data(decimal.Decimal(30000000000000000000))
ff ff ff ff ff ff ff ff 30 ff ff ff ff ff ff ff
00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00
02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00
d8 94 05 39 86 02 00 00 00 00 00 00 00 00 00 00
03 00 00 00 00 00 00 00 6e 5f 63 6f 64 65 5f 68
6f 6f 6b 27 00 00 00 00

mem.data(decimal.Decimal(10000000000000000000*10000000000000000000))
ff ff ff ff ff ff ff ff 30 ff ff ff ff ff ff ff
00 00 00 00 00 00 00 00 27 00 00 00 00 00 00 00
03 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00
18 03 05 39 86 02 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
6f 6f 6b 27 00 00 00 00

mem.data(decimal.Decimal(10000000000000000000*10000000000000000000*10000000000000000000))
ff ff ff ff ff ff ff ff 30 ff ff ff ff ff ff ff
00 00 00 00 00 00 00 00 3a 00 00 00 00 00 00 00
04 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00
18 03 05 39 86 02 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
01 00 00 00 00 00 00 00

mem.data(decimal.Decimal(10000000000000000000*10000000000000000000*10000000000000000000*10000000000000000000))
ff ff ff ff ff ff ff ff 10 ff ff ff ff ff ff ff
00 00 00 00 00 00 00 00 4d 00 00 00 00 00 00 00
05 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00
f0 63 ff 38 86 02 00 00 74 74 72 69 62 75 74 65
20 27 70 72 65 5f 72 75 6e 5f 63 6f 64 65 5f 68
6f 6f 6b 27 00 00 00 00 00 00 00 00 00 00 00 00
01 00 00 00 00 00 00 00 50 60 03 3d f8 7f 00 00
40 00 00 00 00 00 00 00 a5 ed 55 93 b3 7b d4 a1

猜你喜欢

转载自blog.csdn.net/jhsxy2005/article/details/113982201