在C,C++和Java中,整数具有一定的范围。我在 Python 中意识到的一件事是我可以计算非常大的整数,例如 pow(2, 100)
。在 C 语言中,相同的等效代码pow(2, 100)
显然会导致溢出,因为在 32 位体系结构中,无符号整数类型的范围从 0 到 2^32-1。Python怎么可能计算出这些大数字?
基本上,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];
};
Python怎么可能计算出这些大数字?
如果您只有 10 位数字 0-9,您怎么可能计算这些大数字?好吧,您使用了多个数字!
Bignum算术的工作方式相同,只是单个"数字"不是0-9,而是0-4294967296或0-18446744073709551616。