Alg*_*bra 4 lisp emacs types numbers
在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.
Run Code Online (Sandbox Code Playgroud)
它是log2值:
In [8]: math.log2(2305843009213693951)
Out[8]: 61.0
Run Code Online (Sandbox Code Playgroud)
为什么设置为as 2 **61而不是2**62or 2**63?
因为有标签位:当遇到一个对象时,动态类型的语言需要知道它是什么类型。为此,必须有一些“标签”信息告诉它。天真的方法是用至少两个机器单词来表示所有对象:一个标签信息单词和一个至少一个用于对象本身的单词。对于整数之类的对象来说,这是一场灾难,因为这意味着您甚至需要两个机器字才能实现一个很小的整数。反过来这意味着,例如,您(+ 1 2)需要分配存储,而您不希望这样做。
为了解决这个问题,您可以减小小整数(fixum)的最大大小,并将单词中的一些备用位用作标记为“这是一个fixnum”的标记。您可以在此处执行一个非常巧妙的技巧,称为“低标记”:例如,如果在单词的低端保留两个标记位,则可以使其成为(以小尾数位排列):
聪明的事情是,这意味着您的fixnum可能比您预期的大一倍,因为偶数fixnum的低位是0:它与标记位重叠。用这样表示的fixnum加法可以使用机器操作(模溢出),而乘法则需要移位,由于它不涉及内存,因此通常基本上是免费的。我不知道elisp是否使用低标签,尽管我有点假设是这样做的。