gpt4 book ai didi

python - Python 如何处理大于 64 位无符号整数限制的数字?

转载 作者:行者123 更新时间:2023-12-04 01:14:00 27 4
gpt4 key购买 nike

从这个问题 ( How big can a 64bit signed integer be? ) 中,我了解到在 64 位机器上可以使用的最大数字是 2^64-1 , 即 92,233,720,368,547,758,070 .这意味着,即使我添加 1到它,它应该返回 inf .但它没有显示 inf .这是我观察到的:

>>> max = sys.maxsize
>>> format(max, ',')
'9,223,372,036,854,775,807'
>>> a = max * 10
>>> format(a, ',')
'92,233,720,368,547,758,070'
>>> a / max
10.0
即使出于某种原因 92,233,720,368,547,758,070不是Python最大的数字,那 sys.maxsize有什么用? ?
其次,64 位数字不应该占用 64 位内存空间吗?为什么两者都是 maxa正在服用 36 bytes ?
>>> sys.getsizeof(max)
36
>>> sys.getsizeof(a)
36
任何人都可以请描述这两种混淆吗?

最佳答案

整数作为数字数组
Python 3 (CPython) 整数不是 native 机器整数。从逻辑上讲,每个整数都由它的符号和一个以 1073741824(30 位)或 32768(15 位)[*] 为基数的绝对数组成——后者是一个可变大小的无符号整数数组。为了存储更大的数字,需要在数组中添加一个额外的“数字”。

>>> sys.getsizeof(0)          # largest  0-digit number
24
>>> sys.getsizeof(1) # smallest 1-digit number
28
>>> sys.getsizeof(2**30 - 1) # largest 1-digit number
28
>>> sys.getsizeof(2**30) # smallest 2-digit number
32
>>> sys.getsizeof(2**60 - 1) # largest 2-digit number
32
粗略地说,这与写出十进制数时添加数字的机制相同——使用 1 位到 9,2 位到 99,依此类推。同样,只要计算机有内存来“添加一个数字”,就可以定义更大的 Python 整数。
[*] The digits are 30-bit/15-bit instead of 32-bit/16-bit because this better fits some algorithms.例如, long_pow()需要一个可被 5 整除的大小。
整数的对象头
实际上,整数也是对象——这意味着它们保存诸如类型和引用计数之类的元数据——这也会占用空间。在 CPython 中,一个 int consists的:
  • Py_ssize_t的引用计数器
  • 指向 PyTypeObject* 类型的指针
  • Py_ssize_t 的位数
  • digit[] 的可变数字数组

  • 其中前三个是 the structure of every variable size object .符号在数字计数内编码。
    在 64 位机器上, Py_ssize_tPyTypeObject*大小为 8 字节——给出“0 位整数” 0大小为 3*8 字节或 24 字节。
    >>> sys.getsizeof(0)          # largest  0-digit number
    24
    那么什么是 sys.maxsize ? sys.maxsize的含义不是最大整数大小,而是最大容器大小:
    >>> len(range(sys.maxsize))    # this is fine
    9223372036854775807
    >>> len(range(sys.maxsize+1)) # this is one too much
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    OverflowError: range() result has too many items
    This is a direct result of sys.maxsize expressing the maximum value of Py_ssize_t ,CPython 运行时用来表示和寻址内存的类型。虽然这看起来像是任意限制,但实际上是 significantly more than what computers can address .

    关于python - Python 如何处理大于 64 位无符号整数限制的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63922356/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com