[問題] 整數sizeof問題

看板Python作者 (橘白Cat)時間8年前發表 (2017/06/30 04:31), 8年前編輯推噓5(5019)
留言24則, 7人參與, 最新討論串1/1
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官方文件也沒提到 所以上來發問 感激不盡 ----- Sent from JPTT on my Asus ASUS_Z00UD. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 110.28.72.40 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1498797116.A.3F8.html

06/30 14:37, , 1F
我猜是python直譯器 根據平台不同就會有不同的size實作
06/30 14:37, 1F

06/30 15:32, , 2F
python整數類似tuple,每多30位tuple長度多1
06/30 15:32, 2F

06/30 15:33, , 3F
0類似空的tuple,正好空的tuple也是24bytes
06/30 15:33, 3F

06/30 15:35, , 4F
只是tuple長度多1是多8bytes(因為64-bit?)
06/30 15:35, 4F
為何是30位長度多1 就是這個搞不清

06/30 16:35, , 5F
感覺你問的問題都蠻深入的耶!!!!
06/30 16:35, 5F
※ 編輯: LessonWang (110.28.72.40), 06/30/2017 17:35:38

06/30 18:39, , 6F
就只是因為不唸書,伸手牌而已,跟深入有什麼關係?
06/30 18:39, 6F

06/30 18:40, , 7F
去翻 spec 一定有講.至少人家明明白白清清楚楚有交待,
06/30 18:40, 7F

06/30 18:41, , 8F
24 bytes 是指那個 int var 是 0 .不是 0 就會往上加.
06/30 18:41, 8F

06/30 18:44, , 9F
因為 3.x 會自動轉型,所以數值超過原限制就會自動放大
06/30 18:44, 9F

06/30 18:52, , 10F
3.x 版甚至也沒有所謂明顯的數型分別,依據實際值大小,
06/30 18:52, 10F

06/30 18:53, , 11F
可以一直放大,放大到吃爆你記憶體為止.
06/30 18:53, 11F

06/30 18:55, , 12F
每一件東西都只是看點皮毛,然後就開始瞎折騰,要答案,
06/30 18:55, 12F

06/30 18:55, , 13F
這樣是不行的.
06/30 18:55, 13F

06/30 19:01, , 14F
如果是學來找問題,不是一般使用,直接 trace code 得了
06/30 19:01, 14F
實際應用的問題才是問題 這種刁鑽難解而且有關語言本身底層運作的問題 真的毫無意義 只顯得新手想一步登天而已 我會好好考慮之後問問題的模式 謝謝f大

06/30 19:13, , 16F
ude/longintrepr.h#L70
06/30 19:13, 16F

06/30 19:25, , 17F
看了你給的連結,那就應該是因為要和2bytes的版本吻合
06/30 19:25, 17F

06/30 19:48, , 18F
用我的理解幫你整理一下吧。為了方便轉換到帶號整數,
06/30 19:48, 18F

06/30 19:51, , 19F
16-bit版的大數實作只用了15bits,以此寫的pow_mod表有
06/30 19:51, 19F

06/30 19:53, , 20F
32格(2**5)。以此沿用到32-bit版使其只用了30bits。
06/30 19:53, 20F

06/30 19:54, , 21F
也不可能做長2**31的指數表,用30也合理。
06/30 19:54, 21F
原來如此 感謝m大!! ※ 編輯: LessonWang (110.28.72.40), 06/30/2017 19:57:17 ※ 編輯: LessonWang (110.28.72.40), 06/30/2017 19:58:23

06/30 23:59, , 22F
我覺得這個問題還不錯,幫推一個
06/30 23:59, 22F

07/01 00:30, , 23F
你是不是在做這方面的專題呀?
07/01 00:30, 23F
沒有哦

07/01 00:45, , 24F
推trace code從頭來 這麼關注底層乾脆學C++好了
07/01 00:45, 24F
有考慮過xd ※ 編輯: LessonWang (110.28.72.40), 07/01/2017 08:20:53 ※ 編輯: LessonWang (110.28.72.40), 07/01/2017 09:14:14
文章代碼(AID): #1PLTGyFu (Python)