【问题标题】:How does the Python interpreter convert an int to a long?Python 解释器如何将 int 转换为 long?
【发布时间】:2013-04-03 02:59:15
【问题描述】:

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

例如:

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

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

Python解释器如何处理溢出?

【问题讨论】:

    标签: python type-conversion


    【解决方案1】:

    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 类型。然后他们做一个加法。注意他们是如何通过转换各种长整数来检测溢出的。* 如果没有检测到溢出,他们将 C long 转换回 python 对象并返回它。如果出现溢出,您可以看到他们然后再次尝试添加——这一次,使用 python long 类型 (PyLong_Type)。

    如果您查看int_sub,您会发现它几乎是一回事(检测下溢的位技巧略有不同)。 int_mul 似乎有点复杂,并带有一个不错的大块注释。实际上,代码中充斥着关于它们如何在不同情况下处理上溢/下溢的 cmets。信息量很大。

    • 我现在有点太累了,无法解开它,但如果你这样做了,请随时发表评论(或直接编辑)。

    【讨论】:

      【解决方案2】:

      首先,

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

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

      基于此处的问题,How does Python manage int and long?

      另外,根据http://docs.python.org/3.1/whatsnew/3.0.htmlintegers 不再有限制

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

      基本上

      Python 将一个对于整数来说太大的数字无缝转换为长整数。

      文档here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-04
        相关资源
        最近更新 更多