emacs 中的 most-positive-fixnum
the most-positive-fixnum in emacs
在emacs中检查'most-positive-fixnum'中的变量,输出:
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
?
因为有标记位:当遇到一个对象时,dynamically-typed 语言需要知道它是什么类型。为此,必须有一些 'tag' 信息告诉它。一种天真的方法是用至少两个机器字来表示所有对象:一个标记信息字和至少一个对象本身字。这对于像整数这样的对象来说是一场灾难,因为这意味着您需要两个机器字来表示您希望放在一个中的即使是小整数。这反过来意味着,例如,(+ 1 2)
需要分配存储空间,而您不希望它这样做。
为了解决这个问题,您减少了小整数(fixum)的最大大小,并使用单词中的一些备用位作为表示 'this is a fixnum' 的标记。你可以在这里做一个非常聪明的技巧,叫做 'low tags':如果你保留,例如,你可以在单词的低端保留两个标记位(按照 little-endian 位的顺序):
- 0 0: 偶数 fixnum
- 0 1: 奇数 fixnum;
- 1 0, 1 1: 其他两种对象
聪明的是,这意味着您的 fixnums 可以比您预期的大一点,因为偶数 fixnum 的 low-order 位是 0:它与标记位重叠。像这样表示的 fixnums 的加法可以使用机器操作(模数溢出),而乘法需要移位,这通常基本上是免费的,因为它不接触内存。我不知道 elisp 是否使用 low-tags 虽然我有点假设它确实如此。
在emacs中检查'most-positive-fixnum'中的变量,输出:
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
?
因为有标记位:当遇到一个对象时,dynamically-typed 语言需要知道它是什么类型。为此,必须有一些 'tag' 信息告诉它。一种天真的方法是用至少两个机器字来表示所有对象:一个标记信息字和至少一个对象本身字。这对于像整数这样的对象来说是一场灾难,因为这意味着您需要两个机器字来表示您希望放在一个中的即使是小整数。这反过来意味着,例如,(+ 1 2)
需要分配存储空间,而您不希望它这样做。
为了解决这个问题,您减少了小整数(fixum)的最大大小,并使用单词中的一些备用位作为表示 'this is a fixnum' 的标记。你可以在这里做一个非常聪明的技巧,叫做 'low tags':如果你保留,例如,你可以在单词的低端保留两个标记位(按照 little-endian 位的顺序):
- 0 0: 偶数 fixnum
- 0 1: 奇数 fixnum;
- 1 0, 1 1: 其他两种对象
聪明的是,这意味着您的 fixnums 可以比您预期的大一点,因为偶数 fixnum 的 low-order 位是 0:它与标记位重叠。像这样表示的 fixnums 的加法可以使用机器操作(模数溢出),而乘法需要移位,这通常基本上是免费的,因为它不接触内存。我不知道 elisp 是否使用 low-tags 虽然我有点假设它确实如此。