Python是如何表示如此大的整数的?
在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.h 和 longobject.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];
};