3

将 int 转换为 long 时究竟会发生什么?

例如:

a = sys.maxint-1
a = a+2

的声明中发生了什么 a = a + 2

Python 解释器如何处理溢出?

4

2 回答 2

4

让我们阅读源代码(我的机器上有 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);
}

到目前为止,还不错——我们从宏long中的 python 整数类型中获得了 C 类型。CONVERT_TO_LONG然后他们做一个加法。请注意他们如何通过转换各种 long 来提取一些有趣的技巧以检测溢出。* 如果没有检测到溢出,他们将 C 转换long回 python 对象并返回它。如果出现溢出,您可以看到他们然后再次尝试添加——这一次,使用 pythonlong类型 ( PyLong_Type)。

如果您查看int_sub,您会发现它几乎是同一件事(检测下溢的位技巧略有不同)。 int_mul似乎有点复杂,并带有一个很好的大块注释。确实,代码中充斥着关于它们如何在不同情况下处理上溢/下溢的评论。这是非常有用的。

  • 我现在有点太累了,无法解开它,但如果你这样做了,请随时发表评论(或只是编辑)。
于 2013-04-03T03:26:35.363 回答
3

第一的,

int 和 long 被“统一”了几个版本。在此之前,可以通过数学运算溢出 int。

3.x 通过完全消除 int 并且只有 long 进一步推进了这一点。

基于此处的问题,Python 如何管理 int 和 long?

integers此外,根据 http://docs.python.org/3.1/whatsnew/3.0.html不再有限制

sys.maxint 常量已被删除,因为整数值不再有限制。但是,sys.maxsize 可以用作大于任何实际列表或字符串索引的整数。它符合实现的“自然”整数大小,并且通常与同一平台上先前版本中的 sys.maxint 相同(假设相同的构建选项)。

基本上

Python 将对于整数变得太大的数字无缝转换为长整数。

文档在这里

于 2013-04-03T03:09:49.890 回答