Самый положительный-fixnum в emacs

После проверки переменной в 'most-positive-fixnum' в emacs выводится:

most-positive-fixnum is a variable defined in ‘data.c’.
Its value is 2305843009213693951
Documentation:
The largest value that is representable in a Lisp integer.

Это значение log2:

In [8]: math.log2(2305843009213693951)
Out[8]: 61.0

почему установлено как 2 **61, а не 2**62 или 2**63?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
348
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Потому что есть биты тегов: при встрече с объектом язык с динамической типизацией должен знать, какого он типа. Для этого должна быть некоторая информация о «теге», которая говорит об этом. Наивным подходом было бы представление всех объектов как минимум двумя машинными словами: словом информации тега и хотя бы одним словом для самого объекта. Это катастрофа для таких объектов, как целые числа, поскольку это означает, что вам нужно два машинных слова даже для небольших целых чисел, которые вы ожидаете уместить в одно. Это, в свою очередь, означает, что, например, (+ 1 2) необходимо выделить хранилище, чего вы бы не хотели.

Чтобы обойти это, вы уменьшаете максимальный размер небольших целых чисел (фиксумов) и используете некоторые запасные биты в слове в качестве тега, который говорит «это фиксированное число». Существует очень хитрый трюк, который вы можете сделать здесь, называемый «младшими тегами»: если вы зарезервируете, например, два бита тега в нижнем конце слова, вы можете сделать их такими (в порядке битов с прямым порядком байтов):

  • 0 0: четное фиксированное число
  • 0 1: нечетное фиксированное число;
  • 1 0, 1 1: два других вида объектов

Умная вещь заключается в том, что это означает, что ваши fixnums могут быть на один бит больше, чем вы ожидаете, потому что младший бит четного fixnum равен 0: он перекрывается с битами тега. Сложение с фиксированными числами, представленными таким образом, может использовать машинные операции (переполнение по модулю), в то время как умножение требует сдвига, который обычно практически бесплатен, поскольку не затрагивает память. Я не знаю, использует ли elisp низкие теги, хотя я предполагаю, что да.

Другие вопросы по теме