3.1 Основы целых чисел

Парсер Lisp считывает целое число как непустую последовательность десятичных цифр с необязательным начальным знаком и необязательной конечной точкой.

 1               ; Целое число 1.
 1.              ; Целое число 1.
+1               ; Также целое число 1.
-1               ; Целое число минус 1.
 0               ; Целое число 0.
-0               ; Целое число 0.

Синтаксис целых чисел в основаниях, отличных от 10, состоит из «#» с последующим указанием основания, за которым следуют одна или более цифр. Указания оснований — это «b» для двоичного, «o» для восьмеричного, «x» для шестнадцатеричного и «radixr» для основания radix. Таким образом, «#binteger» считывает integer в двоичной системе, а «#radixrinteger» считывает integer в системе счисления radix. Допустимые значения radix варьируются от 2 до 36, а допустимые цифры — это первые radix символов, взятых из «0»–«9», «A»–«Z». Регистр букв игнорируется, и нет начального знака или конечной точки. Например:

#b101100 ⇒ 44
#o54 ⇒ 44
#x2c ⇒ 44
#24r1k ⇒ 44

Чтобы понять, как различные функции работают с целыми числами, особенно побитовые операторы (см. Побитовые операции с целыми числами), часто полезно просматривать числа в их двоичной форме.

В двоичной системе десятичное целое число 5 выглядит так:

…000101

(Эллипсис «…» обозначает концептуально бесконечное количество битов, соответствующих ведущему биту; здесь — бесконечное количество нулей. В последующих примерах также используется эта нотация «…».)

Целое число -1 выглядит так:

…111111

-1 представлен как все единицы. (Это называется нотацией дополнительный код двух.)

Вычитание 4 из -1 дает отрицательное целое число -5. В двоичной системе десятичное число 4 равно 100. Следовательно, -5 выглядит так:

…111011

Многие функции, описанные в этой главе, принимают маркеры в качестве аргументов вместо чисел. (См. Маркеры.) Поскольку фактические аргументы таких функций могут быть либо числами, либо маркерами, мы часто называем эти аргументы number-or-marker. Когда значение аргумента является маркером, используется его позиционное значение, и его буфер игнорируется.

В Emacs Lisp символы текста представляются целыми числами. Любое целое число от нуля до значения (max-char) включительно считается допустимым символом. См. Коды символов.

Целые числа в Emacs Lisp не ограничены размером машинного слова. Однако под капотом существует два типа целых чисел: меньшие, называемые fixnums, и большие, называемые bignums. Хотя код Emacs Lisp обычно не должен зависеть от того, является ли целое число fixnum или bignum, старые версии Emacs поддерживают только fixnums, некоторые функции в Emacs по-прежнему принимают только fixnums, и старый код Emacs Lisp может столкнуться с проблемами при работе с bignums. Например, хотя старый код Emacs Lisp мог безопасно сравнивать целые числа на численное равенство с помощью eq, наличие bignums означает, что теперь следует использовать предикаты равенства, такие как eql и =, для сравнения целых чисел.

Диапазон значений для bignums ограничен объемом основной памяти, машинной характеристиками, такими как размер слова, используемого для представления экспоненты bignum, и переменной integer-width. Эти пределы обычно намного щедрее, чем пределы для fixnums. Bignum никогда не равен численно fixnum; Emacs всегда представляет целое число в диапазоне fixnum как fixnum, а не как bignum.

Диапазон значений для fixnum зависит от машины. Минимальный диапазон составляет от -536 870 912 до 536 870 911 (30 бит; т.е. от -2**29 до 2**29 - 1), но многие машины предоставляют более широкий диапазон.

Переменная: most-positive-fixnum

Значение этой переменной — это наибольшее «маленькое» целое число, с которым может работать Emacs Lisp. Типичные значения: 2**29 - 1 на 32-битных и 2**61 - 1 на 64-битных платформах.

Переменная: most-negative-fixnum

Значение этой переменной — это численно наименьшее «маленькое» целое число, с которым может работать Emacs Lisp. Оно отрицательное. Типичные значения: -2**29 на 32-битных и -2**61 на 64-битных платформах.

Переменная: integer-width

Значение этой переменной — это неотрицательное целое число, которое контролирует, сигнализирует ли Emacs об ошибке диапазона, когда вычисляется большое целое число. Целые числа с абсолютными значениями меньше 2**n, где n — значение этой переменной, не вызывают ошибки диапазона. Попытки создать большие целые числа обычно вызывают ошибку диапазона, хотя может не быть сигнала, если большее целое число можно создать дешево. Установка этой переменной в большое число может быть затратной, если вычисление создает огромные целые числа.