当 int 转换为 long 时,发生了什么?
例如:
例如:
a = sys.maxint-1
a = a+2
a = a + 2
语句中发生了什么?
Python解释器如何处理溢出?
a = sys.maxint-1
a = a+2
a = a + 2
语句中发生了什么?
Python解释器如何处理溢出?
我有一台机器,上面安装了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
宏获得C的long
类型。然后进行加法运算。请注意,他们在将各种长整型强制转换以检测溢出时使用了一些有趣的技巧。如果没有检测到溢出,他们将C的long
转换回Python对象并返回它。如果发生溢出,您可以看到他们再次尝试执行加法——这次使用Python的long
类型(PyLong_Type
)。int_sub
,您会发现它几乎是相同的(稍微有点不同的位操作来检测下溢)。int_mul
似乎要复杂一些,并附有一个很大的块注释。实际上,代码中充斥着关于如何处理不同情况下的溢出/下溢的注释。这非常有启示性。首先,
在几个版本之前,int和long被“统一”了。在此之前,通过数学运算可能会导致int溢出。
3.x进一步推进了这一点,完全消除了int,只有long。
根据这里的问题,Python如何管理int和long?
另外,根据http://docs.python.org/3.1/whatsnew/3.0.html,整数
不再有限制
sys.maxint常量已被删除,因为整数值不再有限制。但是,sys.maxsize可以用作大于任何实际列表或字符串索引的整数。它符合实现的“自然”整数大小,并且通常与同一平台上以前版本(假设使用相同的构建选项)的sys.maxint相同。
基本上:
Python无缝地将一个数字转换为long,如果它变得太大而无法成为一个整数。
文档在这里