代码之家  ›  专栏  ›  技术社区  ›  luc

python如何管理int和long?

  •  94
  • luc  · 技术社区  · 16 年前

    有人知道Python如何管理内部int和long类型吗?

    • 它是否动态选择正确的类型?
    • int的极限是什么?
    • 我使用的是python 2.6,与以前的版本不同吗?

    我应该如何理解下面的代码?

    >>> print type(65535)
    <type 'int'>
    >>> print type(65536*65536)
    <type 'long'>
    

    更新:

    >>> print type(0x7fffffff)
    <type 'int'>
    >>> print type(0x80000000)
    <type 'long'>
    
    9 回复  |  直到 7 年前
        1
  •  102
  •   Liz Av    7 年前

    int long “统一” a few versions back . 在此之前,可以通过数学运算溢出int。

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

    • Python 2 : sys.maxint 包含python int可以容纳的最大值。
      • 在64位的python 2.7上,大小为24字节。用支票 sys.getsizeof() .
    • Python 3 : sys.maxsize 包含python int可以达到的最大字节数。
      • 这将是32位的千兆字节,64位的千兆字节。
      • 这样一个大的int的值类似于8的幂 最大尺寸 .
        2
  •  14
  •   mluebke    16 年前

    这个 PEP 应该帮助。

    最重要的是,在Python版本中,您真的不必担心它。

        3
  •  4
  •   Gringo Suave    15 年前

    有趣。在我的64位(i7 Ubuntu)设备上:

    >>> print type(0x7FFFFFFF)
    <type 'int'>
    >>> print type(0x7FFFFFFF+1)
    <type 'int'>
    

    假设它在一台更大的机器上升级到64位整数。

        4
  •  3
  •   MAK    16 年前

    在我的机器上:

    >>> print type(1<<30)
    <type 'int'>
    >>> print type(1<<31)
    <type 'long'>
    >>> print type(0x7FFFFFFF)
    <type 'int'>
    >>> print type(0x7FFFFFFF+1)
    <type 'long'>
    

    python使用ints(32位有符号整数,我不知道它们是否是遮光罩下的C ints)来表示适合32位的值,但会自动切换到long(任意大量的位,即bignums)来表示任何更大的值。我猜这会加快较小值的速度,同时通过无缝过渡到bignums来避免溢出。

        5
  •  3
  •   nvd    9 年前

    python 2.7.9自动提升数字。 对于不确定使用int()或long()的情况。

    >>> a = int("123")
    >>> type(a)
    <type 'int'>
    >>> a = int("111111111111111111111111111111111111111111111111111")
    >>> type(a)
    <type 'long'>
    
        6
  •  1
  •   Venki    10 年前

    在python 3.x中,统一整数库比旧版本更智能。在我的(i7 Ubuntu)盒子里,我得到了以下信息:

    >>> type(math.factorial(30))
    <class 'int'>
    

    有关实施的详细信息,请参阅 Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c 文件夹。最后一个文件是动态模块(编译为SO文件)。代码注释很好。

        7
  •  1
  •   James Lane    7 年前

    python 2将根据值的大小自动设置类型。最大值指南见下文。

    python 2中默认int的最大值是65535,高于此值的任何值都将是一个长整型。

    例如:

    >> print type(65535)
    <type 'int'>
    >>> print type(65536*65536)
    <type 'long'>
    

    在python 3中,long数据类型已被删除,所有整数值都由int类处理。int的默认大小将取决于您的CPU体系结构。

    例如:

    • 32位系统整数的默认数据类型为“Int32”
    • 64位系统整数的默认数据类型将为“int64”

    每种类型的最小/最大值如下:

    • 国际电话8:[-128127]
    • 国际号码16:[-3276832767]
    • 国际贸易32:[-214748364821474836447]
    • 国际号码64:【922337203685477580892233372036854775807】
    • 国际128:【1701411834604692317318730371588410572817014118346046923173187303715884105727】
    • UIT8:(0255)
    • uint16:[065535]
    • uint32:[04294967295]
    • uint64:[018446744073709551615]
    • uint128:[03402823669209384634633746074317682121455]

    如果int的大小超过上面提到的限制,python将自动更改它的类型并分配更多的内存来处理最小/最大值的增加。在python 2中,它将转换为“long”,现在只转换为下一个int大小。

    示例:如果您使用的是32位操作系统,则int的最大值默认为2147483647。如果指定的值为2147483648或更大,则类型将更改为Int64。

    有不同的方法来检查int的大小和它的内存分配。 注意:在python 3中,使用内置的type()方法将始终返回 <class 'int'> 不管你用的是多大的整数。

        8
  •  0
  •   S.Lott    16 年前

    它管理它们是因为 int long 是同级类定义。它们有适当的方法用于+、-、*、/等,这些方法将产生适当类的结果。

    例如

    >>> a=1<<30
    >>> type(a)
    <type 'int'>
    >>> b=a*2
    >>> type(b)
    <type 'long'>
    

    在本例中,类 int 有一个 __mul__ 方法(实现*)创建 长的 需要时的结果。

        9
  •  0
  •   Nader Belal    7 年前

    继续这里给出的所有答案,尤其是@james lanes

    整数类型的大小可以用以下公式表示:

    总范围=(2位系统)

    下限=—(2位系统)*0.5 上限=(2位系统)*0.5)-1