Python是如何表示如此大的整数的?

6 投票
2 回答
2120 浏览
提问于 2025-04-18 01:25

在C、C++和Java这几种编程语言中,整数有一个固定的范围。比如说,32位的系统中,整数的最大值是2的32次方减去1。如果你试着在这些语言里计算像pow(2, 100)这样的大数字,就会出现溢出的问题,导致计算结果不正确。不过,在Python中,我发现可以计算非常大的整数,比如pow(2, 100),这在其他语言中是做不到的。那么,Python是怎么做到计算这么大的数字的呢?

2 个回答

1

Python是怎么计算这些大数字的呢?

如果你只有0到9这10个数字,怎么能计算出这么大的数字呢?其实,你是用多个数字来表示的!

大数运算的原理和这个一样,只不过这里的“数字”不是0到9,而是从0到4294967296或者从0到18446744073709551616。

11

简单来说,Python中的大数字是用一个个“数字”来存储的。这里的“数字”是加了引号的,因为每个“数字”其实可以是一个相当大的数。

如果你想了解具体的实现细节,可以查看这两个链接:longintrepr.hlongobject.c

这里有两种不同的参数设置:一种是30位的数字,存储在一个无符号的32位整数中;另一种是15位的数字,每个数字存储在一个无符号短整型中。PYLONG_BITS_IN_DIGIT的值是在配置时定义的,或者在pyport.h中定义,用来决定使用哪种数字大小。

/* Long integer representation.
    The absolute value of a number is equal to
    SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
    Negative numbers are represented with ob_size < 0; 
      zero is represented by ob_size == 0.

    In a normalized number, ob_digit[abs(ob_size)-1] (the most significant
      digit) is never zero.  Also, in all cases, for all valid i,
        0 <= ob_digit[i] <= MASK.

    The allocation function takes care of allocating extra memory
    so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available.

*/

struct _longobject {
   PyObject_VAR_HEAD
   digit ob_digit[1];
};

撰写回答