Как C реализует назначение Python больших чисел

Тот факт, что Python написан на C и на самом деле является программой на C, заставлял меня задуматься о том, как обрабатываются десятичные числа.

Как программа C реализует назначение переменной Python очень большого десятичного числа (больше, чем int или long)?

Например:

a=10000...  # a=(10^1000)

при запуске в python я знаю, что значение настолько велико, что в памяти требуется много слов, поэтому программа C явно делает это, но как?

Каждая переменная в C имеет тип, но скомпилированный код C не знает, насколько большим будет число.

Как программа (python) C обрабатывает это присвоение? (и операции над такими переменными)

Ответ 1

Вот C struct, который используется в CPython 2.7.5 для представления длинного целого числа:

/* 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 sign bit.
*/

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

Если вы хотите изучить это далее, загрузить исходный код и посмотреть следующие файлы:

./Include/longintrepr.h
./Include/longobject.h
./Objects/longobject.c

Это расскажет вам каждую деталь, которую вы, возможно, захотите узнать.:)

Ответ 2

У Python может быть большая реализация по собственному усмотрению по соображениям производительности, но она может использовать любую стороннюю библиотеку произвольной точности, такую ​​как GMP.