Types emacs中最积极的fixnum

Types emacs中最积极的fixnum,types,emacs,numbers,lisp,Types,Emacs,Numbers,Lisp,在检查emacs中“最积极的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

在检查emacs中“最积极的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

因为存在标记位:当遇到对象时,动态类型的语言需要知道它是什么类型。要做到这一点,必须有一些“标签”信息告诉它。一种简单的方法是用至少两个机器字来表示所有对象:一个标记信息字和至少一个对象本身字。对于像整数这样的对象来说,这是一场灾难,因为这意味着即使是很小的整数,也需要两个机器字,而这两个机器字可以放在一个机器字中。这反过来意味着,例如,
(+12)
需要分配存储,而您不希望它这样做

为了解决这个问题,您减少了小整数(fixum)的最大大小,并使用单词中的一些空闲位作为表示“thisafixnum”的标记。这里有一个非常聪明的技巧叫做“低位标记”:例如,如果你在单词的低端保留两个标记位,你可以使它们成为(按位的小端顺序排列):

  • 0:偶数fixnum
  • 01:奇数fixnum
  • 10,11:两种其他类型的对象
聪明的是,这意味着您的fixnum可以比您预期的大一点,因为偶数fixnum的低阶位是0:它与标记位重叠。用这样表示的fixnums进行加法可以使用机器操作(模溢出),而乘法需要移位,这通常是免费的,因为它不涉及内存。我不知道elisp是否使用了low标记,尽管我有点假设它使用了