Основы целых чисел
Читатель Lisp считывает целое число как непустую последовательность десятичных цифр с необязательным начальным знаком и необязательной конечной точкой.
1 ; The integer 1. 1. ; The integer 1. +1 ; Also the integer 1. -1 ; The integer -1. 0 ; The integer 0. -0 ; The integer 0.
Синтаксис целых чисел в системах счисления, отличных от 10, состоит из ‘#’, за которым следует указание основания, за которым следует одна или несколько цифр. Указатели основания — это ‘b’ для двоичной системы, ‘o’ для восьмеричной, ‘x’ для шестнадцатеричной и ‘основаниеr’ для системы счисления с основанием основание. Таким образом, ‘#bцелое_число’ считывает целое_число в двоичной системе, а ‘#основаниеrцелое_число’ считывает целое_число в системе счисления с основанием основание. Допустимые значения основания находятся в диапазоне от 2 до 36, а допустимые цифры — это первые основание символов, взятых из ‘0’–‘9’, ‘A’–‘Z’. Регистр букв не учитывается, и нет начального знака или конечной точки. Например:
#b101100 ⇒ 44 #o54 ⇒ 44 #x2c ⇒ 44 #24r1k ⇒ 44
Чтобы понять, как различные функции работают с целыми числами, особенно битовые операторы (см. Битовые операции), часто полезно рассматривать числа в двоичной форме.
В двоичной системе десятичное целое число 5 выглядит так:
…000101
(Эллипсис ‘…’ обозначает концептуально бесконечное количество битов, которые соответствуют старшему биту; здесь — бесконечное число нулевых битов. В последующих примерах также используется обозначение ‘…’.)
Целое число -1 выглядит так:
…111111
-1 представлен как единицы. (Это называется нотацией дополнительного кода.)
Вычитание 4 из -1 возвращает отрицательное целое число -5. В двоичной системе десятичное целое число 4 равно 100. Следовательно, -5 выглядит так:
…111011
Многие функции, описанные в этой главе, принимают маркеры в качестве аргументов вместо чисел. (См. Маркеры.) Поскольку фактические аргументы таких функций могут быть либо числами, либо маркерами, мы часто называем эти аргументы число-или-маркер. Когда значение аргумента является маркером, используется его значение позиции, а его буфер игнорируется.
В 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 — значение этой переменной, не сигнализируют об ошибке диапазона. Попытки создать более крупные целые числа обычно сигнализируют об ошибке диапазона, хотя сигнал может быть отсутствовать, если более крупное целое число может быть создано недорого. Установка этой переменной на большое число может быть дорогостоящей, если вычисление создаёт огромные целые числа.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Integer-Basics.html