gpt4 book ai didi

types - emacs 中的 most-positive-fixnum

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:48 24 4
gpt4 key购买 nike

在 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

最佳答案

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

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

  • 0 0: 偶数 fixnum
  • 0 1: 奇数;
  • 1 0, 1 1: 其他两种对象

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

关于types - emacs 中的 most-positive-fixnum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56322221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com