2013-04-03 66 views

回答

3

首先,

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

4

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似乎更復雜一點,並附帶一個不錯的大塊評論。真的,代碼充斥着關於它們在不同情況下如何處理上溢/下溢的評論。這是相當豐富的。

  • 我現在有點太累了,現在要解開它,但如果你這樣做,隨時留下評論(或只是編輯)。