Основы работы с целыми числами
Считыватель 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.
Синтаксис целых чисел в системах счисления, отличных от десятичной, состоит из «#», за которым следует обозначение основания, а затем одна или несколько цифр. Обозначения основания: «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 не ограничен размером машинного слова. Однако на низком уровне существуют два вида целых чисел: меньшие, называемые фиксну́мами, и большие, называемые бигну́мами. Хотя обычно код Emacs Lisp не должен зависеть от того, является ли целое число фикснумом или бигнумом, старые версии Emacs поддерживают только фикснумы, некоторые функции Emacs по-прежнему принимают только фикснумы, а старый код Emacs Lisp может работать некорректно при передаче ему бигнумов. Например, если старый код Emacs Lisp мог безопасно сравнивать целые числа на числовое равенство с помощью eq, то из-за наличия бигнумов для сравнения целых чисел теперь следует использовать предикаты равенства, такие как eql и =.
Диапазон значений бигнумов ограничен объёмом оперативной памяти, характеристиками машины, такими как размер слова, используемого для представления показателя степени бигнума, и переменной integer-width. Обычно эти ограничения значительно менее строгие, чем ограничения для фикснумов. Бигнум никогда не бывает численно равен фикснуму; Emacs всегда представляет целое число, попадающее в диапазон фикснумов, как фикснум, а не как бигнум.
Диапазон значений фикснума зависит от машины. Минимальный диапазон — от −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-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Integer-Basics.html