作者LessonWang (橘白Cat)
看板Python
標題[問題] 整數sizeof問題
時間Fri Jun 30 12:31:54 2017
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://webptt.com/m.aspx?n=bbs/Python/M.1498797116.A.3F8.html
1F:推 Yshuan: 我猜是python直譯器 根據平台不同就會有不同的size實作 06/30 14:37
2F:→ mikapauli: python整數類似tuple,每多30位tuple長度多1 06/30 15:32
3F:→ mikapauli: 0類似空的tuple,正好空的tuple也是24bytes 06/30 15:33
4F:→ mikapauli: 只是tuple長度多1是多8bytes(因為64-bit?) 06/30 15:35
為何是30位長度多1 就是這個搞不清
5F:推 HenryLiKing: 感覺你問的問題都蠻深入的耶!!!! 06/30 16:35
※ 編輯: LessonWang (110.28.72.40), 06/30/2017 17:35:38
6F:→ freeunixer: 就只是因為不唸書,伸手牌而已,跟深入有什麼關係? 06/30 18:39
7F:→ freeunixer: 去翻 spec 一定有講.至少人家明明白白清清楚楚有交待, 06/30 18:40
8F:→ freeunixer: 24 bytes 是指那個 int var 是 0 .不是 0 就會往上加. 06/30 18:41
9F:→ freeunixer: 因為 3.x 會自動轉型,所以數值超過原限制就會自動放大 06/30 18:44
10F:→ freeunixer: 3.x 版甚至也沒有所謂明顯的數型分別,依據實際值大小, 06/30 18:52
11F:→ freeunixer: 可以一直放大,放大到吃爆你記憶體為止. 06/30 18:53
12F:→ freeunixer: 每一件東西都只是看點皮毛,然後就開始瞎折騰,要答案, 06/30 18:55
13F:→ freeunixer: 這樣是不行的. 06/30 18:55
14F:→ freeunixer: 如果是學來找問題,不是一般使用,直接 trace code 得了 06/30 19:01
實際應用的問題才是問題 這種刁鑽難解而且有關語言本身底層運作的問題 真的毫無意義 只顯得新手想一步登天而已 我會好好考慮之後問問題的模式 謝謝f大
16F:→ LessonWang: ude/longintrepr.h#L70 06/30 19:13
17F:→ mikapauli: 看了你給的連結,那就應該是因為要和2bytes的版本吻合 06/30 19:25
18F:→ mikapauli: 用我的理解幫你整理一下吧。為了方便轉換到帶號整數, 06/30 19:48
19F:→ mikapauli: 16-bit版的大數實作只用了15bits,以此寫的pow_mod表有 06/30 19:51
20F:→ mikapauli: 32格(2**5)。以此沿用到32-bit版使其只用了30bits。 06/30 19:53
21F:→ mikapauli: 也不可能做長2**31的指數表,用30也合理。 06/30 19:54
原來如此 感謝m大!!
※ 編輯: LessonWang (110.28.72.40), 06/30/2017 19:57:17
※ 編輯: LessonWang (110.28.72.40), 06/30/2017 19:58:23
22F:推 darkgerm: 我覺得這個問題還不錯,幫推一個 06/30 23:59
23F:推 HenryLiKing: 你是不是在做這方面的專題呀? 07/01 00:30
沒有哦
24F:推 Sunal: 推trace code從頭來 這麼關注底層乾脆學C++好了 07/01 00:45
有考慮過xd
※ 編輯: LessonWang (110.28.72.40), 07/01/2017 08:20:53
※ 編輯: LessonWang (110.28.72.40), 07/01/2017 09:14:14