為什麼C 中的int限制長度,而Python中的int不限長度?

時間 2021-05-08 09:31:42

1樓:支援向量機

C++int是記憶體順序排列的二進位制,在同一計算機編譯器下是定長的,常見的都是4位元組。而python的int是乙個類,不僅僅是一段記憶體資料,還有各種方法,屬性,最關鍵的是,它是變長的,如下所示:

struct _longobject ;

PyObject_VARHEAD說明int(Py3中只有long)是變長型別,所以意味著會有乙個ob_size變數儲存長度(PS:Cpython3規定ob_size<0代表負數,=0代表0,>0代表正數),而具體的數值就存在上面這個ob_digit中。簡單來說數字很大的話ob_size就會很大,比如ob_size=4,這個ob_digit陣列就長度為4,而每個digit都是32位的(64位計算機),結果就是理論上可以存32*4長度的數字(實際上不是,實際上64位每個digit是取30位,32位則取15位,不影響理解),所以python中的整形是沒有長度限制的。

2樓:ArtoriasPhD

編譯型語言編譯的時候大部分時候每個變數的記憶體空間是根據變數型別寫死的,所以寫大數的時候會導致記憶體溢位的漏洞。python是解釋型語言,執行時候變數的記憶體空間可以動態分配。

3樓:shuhari

在 Python2 的時候,int 和 long 曾經是兩種不同的型別,通常 int 計算結果太大的話會自動轉換成 long,但在個別情況下也會發生溢位。

到 Python3,設計者為了減輕使用者的心智負擔、並且避免行為上的不一致,決定把它們統一起來。所以 int 會在內部自動處理結果位數,不再有長度的問題。

這些設計上的變更在文件裡面也能找到一些線索,比如 PEP 237。

4樓:「已登出」

C/C++的所有基本資料型別都對應到硬體支援的型別,這樣的操作效率最高,一條指令完成。

Python3的整數型別是乙個物件,內部是大整數系統,多個整數拼接成乙個大整數,運算的時候對這些小整數逐個操作,只要記憶體夠就可以足夠大,缺點是效率太慢,所有在加密演算法測試中,喜領倒數第一,衛冕至今!

5樓:普通少年pro max

C語言的那個int、long等型別,基本你可以認為有就是實際的數值型別,編譯後幾乎可以沒有太多損失的對應到一條機器語言上。即C語言對int、long等關鍵字的實現,基本是和最後編譯出來的機器碼差不多有乙個最高效的對應實現。

Python其抽象層次遠高於C語言,同時Python的主流實現都不是編譯型語言,官方Python直譯器我記得是C語言實現,其Python語法解析後,執行在Python虛擬機器中,由於這個虛擬機器是虛擬出來的,所以他怎麼弄都行,你規定int型別會把數都開根號都可以。

你所在Python中看到的int,是乙個物件,語法糖之類的,因此你可以存任意大的數,至於大數具體怎麼存,這個你就不需要操心了,為了讓你使用方便,其髒活累活都在虛擬機器中實現了,不需要使用者考慮。

由於其虛擬機器也需要和實際的機器打交道,因此對於超大數,也需要考慮在C/C++中怎麼實現。比如使用C實現其虛擬機器時,大於int範圍了,就擴充套件使用long型別,或者再大到一定程度,你就用字元陣列來模擬儲存,然後實現一套對應的運算方法等等(由於沒看過其原始碼,這裡只是說一下這個意思,不代表就是這樣實現的),用C/C++你也可以自己模擬乙個大數物件來處理~

為什麼C語言要有 int 作為 main 函式的返回值,而不是 void?

main函式的返回值會被shell捕獲,並存到乙個環境變數中。在一些main loop結構的嵌入式系統中,main的返回值沒太有意義,因為嵌入式系統的軟體不會結束 上電後一直執行 或者在一些練習性質的程式中,我們也不太關注main函式的返回值。linux系統有個設計理念 乙個程式只做一件事情,並把它...

為什麼CFA中的 C 是Chartered而不是Certified?

Morgan 1.Statement of financial position 這個用詞是 USGAAP and IFRS的制定者考慮到資產負債表反應的不僅僅是乙個餘額,而更多的側重於企業的狀況,所以在大約2009年左右 具體時間記不清了,但是可以查到的 修改了這個表述方式。而非某一家美國公司的做...

C 中的 this 為什麼是指標而不是引用?

中二青年 這個是c 作者的個人主頁,可以看一下答案,裡面還回答了,為什麼引入ref的原因。Why is this not a reference?Because this was introduced into C really into C with Classes before referenc...