Python等语言如何克服C的Integral数据限制?

2 c python types integer

在C,Python和Scheme中使用factorial程序进行一些随机实验.我发现了这个事实:

在C中,使用'unsigned long long'数据类型,我可以打印的最大因子是65.这是'9223372036854775808',这里指定的是19位数 .

在Python中,我可以找到一个大到999的数字的阶乘,它由大量的数字组成,远远超过19.

CPython如何实现这一目标?它是否使用像' octaword ' 这样的数据类型?

我可能会遗漏一些基本事实.所以,我会很感激一些见解和/或参考阅读.谢谢!

更新:谢谢大家的解释.这是否意味着,CPython正在使用GNU多精度库(或其他类似的库)?

更新2:我在源代码中寻找Python的'bignum'实现.到底在哪里?它位于http://svn.python.org/view/python/trunk/Objects/longobject.c?view=markup.谢谢Baishampayan.

syk*_*ora 9

它被称为任意精度算术.这里有更多:http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic


Bai*_*ose 6

看看Python源代码,似乎这个long类型(至少在Python 3之前的代码中)是在longintrepr.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.

   CAUTION:  Generic code manipulating subtypes of PyVarObject has to
   aware that longs abuse  ob_size's sign bit.
*/

struct _longobject {
    PyObject_VAR_HEAD
    digit ob_digit[1];
};
Run Code Online (Sandbox Code Playgroud)

long然后通过创建一个像这样的新类型PyLongObject 在longobject.h中定义该类型的实际可用接口-

typedef struct _longobject PyLongObject;
Run Code Online (Sandbox Code Playgroud)

等等.

longobject.c中发生了更多的事情,您可以查看这些内容以获取更多详细信息.