當int被轉換爲long值時究竟發生了什麼?Python解釋器如何將int轉換爲long?
例如:
a = sys.maxint-1
a = a+2
什麼在a = a + 2
聲明發生了什麼?
Python解釋器如何處理溢出?
當int被轉換爲long值時究竟發生了什麼?Python解釋器如何將int轉換爲long?
例如:
a = sys.maxint-1
a = a+2
什麼在a = a + 2
聲明發生了什麼?
Python解釋器如何處理溢出?
首先,
int和長期都 「統一」 了幾個版本了。在此之前,可以通過數學運算來溢出int。
3.x通過完全消除int並且只有很長的時間來進一步提高這一點。
基於此問題,How does Python manage int and long?
此外,也不再根據http://docs.python.org/3.1/whatsnew/3.0.html
的,sys.maxint常量上
integers
的限制已被刪除,因爲不再有限制整數的值爲 。但是,sys.maxsize可以用作比實際列表或字符串索引大的 整數。它符合 實現的「自然」整數大小,並且通常與先前發行版中的sys.maxint在同一平臺上(假設 具有相同的構建選項)相同,爲 。
基本上:
Python的無縫轉換一個數字,成爲一個整數爲長太大。
文檔here
讓read the source(我有我的機器上python2.7.3):
這裏就是加法發生(據我可以告訴):
static PyObject *
int_add(PyIntObject *v, PyIntObject *w)
{
register long a, b, x;
CONVERT_TO_LONG(v, a);
CONVERT_TO_LONG(w, b);
/* casts in the line below avoid undefined behaviour on overflow */
x = (long)((unsigned long)a + b);
if ((x^a) >= 0 || (x^b) >= 0)
return PyInt_FromLong(x);
return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
}
到目前爲止,還不錯 - 我們從CONVERT_TO_LONG
宏中的python整數類型中獲得C long
類型。然後他們做一個補充。注意他們如何通過投射各種longs以檢測溢出來吸引一些有趣的技巧。*如果未檢測到溢出,它們將C long
轉換回python對象並返回。如果發生溢出,您可以看到他們再次嘗試添加 - 這次使用python long
類型(PyLong_Type
)。
如果你看看int_sub
,你會發現它幾乎是一樣的東西(在檢測下溢時稍微有點不同)。 int_mul
似乎更復雜一點,並附帶一個不錯的大塊評論。真的,代碼充斥着關於它們在不同情況下如何處理上溢/下溢的評論。這是相當豐富的。