在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
?
答案 0 :(得分:7)
因为有标签位:遇到对象时,动态类型化的语言需要知道它是什么类型。为此,必须有一些“标签”信息告诉它。天真的方法是用至少两个机器字来表示所有对象:一个标签信息字和一个至少一个用于对象本身的字。对于整数之类的对象而言,这是一场灾难,因为这意味着您甚至需要两个机器字才能实现一个很小的整数。反过来,这意味着(+ 1 2)
需要分配存储空间,而您不希望这样做。
要解决此问题,您可以减小小整数(fixums)的最大大小,并使用单词中的一些备用位作为标记“这是一个Fixnum”。您可以在此处执行一个非常巧妙的技巧,称为“低标签”:例如,如果在单词的低端保留两个标签位,则可以使它们成为(以小尾数位排列): / p>
聪明的事情是,这意味着您的fixnum可能比您预期的大一倍,因为偶数fixnum的低位是0:它与标记位重叠。用这样表示的fixnum加法可以使用机器操作(模溢出),而乘法则需要移位,由于它不涉及内存,因此通常基本上是免费的。我不知道elisp是否使用低标签,尽管我以为是这样。