[问题] 整数sizeof问题

楼主: LessonWang (橘白Cat)   2017-06-30 12:31:54
python新手发问
在实作时遇到一个问题
(0).__sizeof__()
回传24bytes的大小
(1).__sizeof__()
为28bytes的大小
(1073741823).__sizeof__()
为28bytes的大小
(1073741824).__sizeof__()
为32bytes的大小
总结以上和实作
整数0 大小为24bytes
整数1~1073741823及-1~-1073741823为28bytes
整数1073741824~? 为32bytes
....以此类推
我想要问的是
1073741824大小为什么是32bytes
而1073741823大小为什么是28bytes
这个数字是如何推导出来的?
或者说背后的储存原理是什么?
(这个数字我是用for+if去抓出来的)
还有 为什么整数0大小却是24bytes
而1之后却是28bytes了
爬stackoverflow没有相关的问题
google也没有讲解
甚至连python官方文件也没提到
所以上来发问
感激不尽
作者: Yshuan (倚絃)   2017-06-30 14:37:00
我猜是python直译器 根据平台不同就会有不同的size实作
作者: mikapauli (桜花)   2017-06-30 15:32:00
python整数类似tuple,每多30位tuple长度多10类似空的tuple,正好空的tuple也是24bytes只是tuple长度多1是多8bytes(因为64-bit?)
作者: HenryLiKing (HenryLiKing)   2017-06-30 16:35:00
感觉你问的问题都蛮深入的耶!!!!
作者: freeunixer (御剑客)   2017-06-30 18:39:00
就只是因为不唸书,伸手牌而已,跟深入有什么关系?去翻 spec 一定有讲.至少人家明明白白清清楚楚有交待,24 bytes 是指那个 int var 是 0 .不是 0 就会往上加.因为 3.x 会自动转型,所以数值超过原限制就会自动放大3.x 版甚至也没有所谓明显的数型分别,依据实际值大小,可以一直放大,放大到吃爆你内存为止.每一件东西都只是看点皮毛,然后就开始瞎折腾,要答案,这样是不行的.如果是学来找问题,不是一般使用,直接 trace code 得了
楼主: LessonWang (橘白Cat)   2017-06-30 19:13:00
作者: mikapauli (桜花)   2017-06-30 19:25:00
看了你给的连结,那就应该是因为要和2bytes的版本吻合用我的理解帮你整理一下吧。为了方便转换到带号整数,16-bit版的大数实作只用了15bits,以此写的pow_mod表有32格(2**5)。以此沿用到32-bit版使其只用了30bits。也不可能做长2**31的指数表,用30也合理。
作者: darkgerm (黑骏)   2017-06-30 23:59:00
我觉得这个问题还不错,帮推一个
作者: HenryLiKing (HenryLiKing)   2017-07-01 00:30:00
你是不是在做这方面的专题呀?
作者: Sunal (SSSSSSSSSSSSSSSSSSSSSSS)   2017-07-01 00:45:00
推trace code从头来 这么关注底层干脆学C++好了

Links booklink

Contact Us: admin [ a t ] ucptt.com