GMP динамически распределяет пространство для представления чисел (и перераспределяет, когда ему нужно расти).
Это подробно описано в Integer Internals, в руководстве GMP , в котором описывается, как он разбивает представление на «конечности» и сохраняет конечности в массиве.
Описание термина "конечности" происходит от Основы GMP: номенклатура и типы :
Конечность означает часть числа с высокой точностью, которая помещается в одно слово. (Мы выбрали это слово, потому что конечность человеческого тела аналогична цифре, только больше и содержит несколько цифр.) Обычно конечность содержит 32 или 64 бита. Тип данных C для конечности - mp_limb_t.
Таким образом, представление числа в GMP работает путем объединения нескольких конечностей в единое целое, чтобы представить величину целого числа, хранимого со знаковым битом (знаковый бит имеет двойное назначение для хранения числа конечностей).
Что это значит для вас? Ну, обычно int64 представляется в 64 битах. Готово. Если вы соберете их вместе, вы можете значительно увеличить это. Положите два вместе, 2 ^ 64 * 2 ^ 64 или 2 ^ 128. Добавьте еще две конечности, и вы получите 2 ^ 256. Это много цифр, хранящихся в 4 словах (плюс издержки на представление).
Конечно, представление с плавающей точкой является более сложным ( см. Здесь ), сохраняя представление с помощью мантиссы (состоящей из знака и величины) и показателя степени.