Python解释器如何将整数转换为长整型?

3
当 int 转换为 long 时,发生了什么?
例如:
a = sys.maxint-1
a = a+2

a = a + 2语句中发生了什么?

Python解释器如何处理溢出?

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);
}

到目前为止,情况还不错——我们从Python整数类型中使用CONVERT_TO_LONG宏获得C的long类型。然后进行加法运算。请注意,他们在将各种长整型强制转换以检测溢出时使用了一些有趣的技巧。如果没有检测到溢出,他们将C的long转换回Python对象并返回它。如果发生溢出,您可以看到他们再次尝试执行加法——这次使用Python的long类型(PyLong_Type)。
如果您查看int_sub,您会发现它几乎是相同的(稍微有点不同的位操作来检测下溢)。int_mul似乎要复杂一些,并附有一个很大的块注释。实际上,代码中充斥着关于如何处理不同情况下的溢出/下溢的注释。这非常有启示性。
我现在有点累了,无法解开它,但如果您能,请随意留下评论(或直接编辑)。

3

首先,

在几个版本之前,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,如果它变得太大而无法成为一个整数。

文档在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接