【问题标题】:the most-positive-fixnum in emacsemacs 中最正的fixnum
【发布时间】:2019-05-27 08:21:03
【问题描述】:

在 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**622**63

【问题讨论】:

    标签: types emacs numbers lisp


    【解决方案1】:

    因为有标签位:当遇到一个对象时,动态类型语言需要知道它是什么类型。为此,必须有一些“标签”信息告诉它。一种天真的方法是用至少两个机器词来表示所有对象:一个标签信息词和至少一个对象本身的词。这对于像整数这样的对象来说是一场灾难,因为这意味着你需要两个机器字来处理你希望能放在一个里面的小整数。这反过来意味着,例如,(+ 1 2) 需要分配存储空间,而您不希望它这样做。

    要解决这个问题,您可以减少小整数(fixums)的最大大小,并使用单词中的一些备用位作为“这是一个fixnum”的标签。您可以在这里使用一个非常聪明的技巧,称为“低标签”:例如,如果您在单词的低端保留两个标签位,您可以使它们成为(按照位的小端顺序):

    • 0 0: 偶数固定号
    • 0 1:奇数fixnum;
    • 1 0, 1 1:另外两种对象

    聪明的一点是,这意味着你的 fixnums 可能比你预期的大一点,因为偶数 fixnum 的低位是 0:它与标记位重叠。像这样表示的带有固定数字的加法可以使用机器操作(模溢出),而乘法需要移位,这通常基本上是免费的,因为它不涉及内存。我不知道 elisp 是否使用低标签,尽管我有点假设它确实如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多