在C、C++和Java中,整数有一定的范围。我在 Python 中意识到的一件事是我可以计算非常大的整数,例如pow(2, 100)
。相同的等效代码,在 C 语言中,pow(2, 100)
显然会导致溢出,因为在 32 位体系结构中,无符号整数类型的范围是从 0 到 2^32-1。 Python 是如何计算这些大数字的呢?
基本上,Python 中的大数字存储在“数字”数组中。这被引用了,对吧,因为每个“数字”本身实际上可能是一个相当大的数字。 )
您可以在中查看实施细节长整数h http://svn.python.org/view/python/trunk/Include/longintrepr.h?view=markup and 长对象.c http://svn.python.org/view/python/trunk/Objects/longobject.c?view=markup:
有两组不同的参数:一组为 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];
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)