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

Fah*_*him 5 python 64-bit integer

从这个问题(How big can a 64bitsigned 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
Run Code Online (Sandbox Code Playgroud)

即使由于某种原因92,233,720,368,547,758,070不是Python的最大数字,那么 又有什么用呢sys.maxsize

其次,64位的数字不应该占用64位的内存空间吗?为什么 和maxa服用36 bytes

>>> sys.getsizeof(max)
36
>>> sys.getsizeof(a)
36
Run Code Online (Sandbox Code Playgroud)

谁能描述一下这两种混乱吗?

Mis*_*agi 7

整数作为数字数组

\n

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

\n
>>> sys.getsizeof(0)          # largest  0-digit number\n24\n>>> sys.getsizeof(1)          # smallest 1-digit number\n28\n>>> sys.getsizeof(2**30 - 1)  # largest  1-digit number\n28\n>>> sys.getsizeof(2**30)      # smallest 2-digit number\n32\n>>> sys.getsizeof(2**60 - 1)  # largest  2-digit number\n32\n
Run Code Online (Sandbox Code Playgroud)\n

粗略地说,这与在写出十进制数 \xe2\x80\x93 时添加数字相同的机制,使用 1 位数字足以达到 9,2 位数字达到 99,依此类推。同样,只要计算机有内存“添加一个数字”,就可以定义更大尺寸的 Python 整数。

\n

[*]数字是 30 位/15 位,而不是 32 位/16 位,因为这更适合某些算法。例如,long_pow()需要可被 5 整除的大小。

\n

整数的对象标头

\n

实际上,整数也是对象 \xe2\x80\x93 ,这意味着它们保存类型和引用计数等元数据 - 这也占用空间。在 CPython 中,anint包含

\n
    \n
  • 的参考计数器Py_ssize_t
  • \n
  • 指向类型的指针PyTypeObject*
  • \n
  • 的位数Py_ssize_t
  • \n
  • 的数字可变数组digit[]
  • \n
\n

其中前三个是每个可变大小对象的结构。该符号被编码在数字计数内。

\n

在 64 位机器上, 和Py_ssize_tPyTypeObject*大小均为 8 字节 \xe2\x80\x93,从而使“0 位整数”的0大小为 3*8 字节或 24 字节。

\n
>>> sys.getsizeof(0)          # largest  0-digit number\n24\n
Run Code Online (Sandbox Code Playgroud)\n

那么什么是sys.maxsize

\n

的含义sys.maxsize不是最大整数大小,而是最大容器大小:

\n
>>> len(range(sys.maxsize))    # this is fine\n9223372036854775807\n>>> len(range(sys.maxsize+1))  # this is one too much\nTraceback (most recent call last):\n  File "<stdin>", line 1, in <module>\nOverflowError: range() result has too many items\n
Run Code Online (Sandbox Code Playgroud)\n

sys.maxsize这是表达 的最大值的直接结果Py_ssize_t,CPython 运行时使用该类型来表示和寻址内存。虽然这看起来像是一个任意的限制,但实际上它远远超出了计算机可以解决的范围

\n