[問題] 整數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