3.1 整数基础

Lisp 读取器将整数解析为非空十进制数字序列,可带可选的正负号,以及可选的末尾句点。

 1               ; The integer 1.
 1.              ; The integer 1.
+1               ; Also the integer 1.
-1               ; The integer −1.
 0               ; The integer 0.
-0               ; The integer 0.

非十进制进制的整数语法为:以 ‘#’ 开头,后跟进制标识,再跟一位或多位数字。进制标识:‘b’ 为二进制、‘o’ 为八进制、‘x’ 为十六进制、‘radixr’ 为自定义 radix 进制。因此,‘#binteger’ 按二进制读取 integer,‘#radixrinteger’ 按 radix 进制读取 integerradix 的值合法进制范围:2~36。合法数字:从 ‘0’–‘9’、‘A’–‘Z’ 中取前 radix 个字符。字母大小写不敏感,不能带符号或末尾句点。 示例:

#b101100 ⇒ 44
#o54 ⇒ 44
#x2c ⇒ 44
#24r1k ⇒ 44

要理解各类整数相关函数,尤其是按位运算符(see 整数的按位运算),通常需要以二进制形式看待数值。

十进制整数 5 的二进制形式:

...000101

(省略号 ‘’ 表示理论上无限多的前导相同位,这里是无限个 0。后续示例也会使用此 ‘’ 写法。)

整数 −1 的二进制形式:

...111111

−1 表示为全 1,这称为 two’s complement二进制补码 表示法。

从 −1 减去 4 得到负整数 −5。十进制 4 的二进制是 100,因此 −5 的二进制为:

...111011

本章介绍的许多函数可以接受标记(marker) 代替数值作为参数。(See Markers。)由于这类函数的实参可以是数值或标记,我们常将参数命名为 number-or-marker。当参数是标记时,使用其位置值,忽略其所在缓冲区。

在 Emacs Lisp 中,文本字符用整数表示。0 到 (max-char)(包含)之间的任意整数都可作为合法字符。See Character Codes

Emacs Lisp 的整数不受机器字长限制。但底层实现上,整数分为两类:较小的整数为 fixnums定长数、较大的整数为 bignum大数。 通常 Emacs Lisp 代码不应依赖整数是 fixnum 还是 bignum。但旧版 Emacs 只支持 fixnum,部分函数仍只接受 fixnum,旧代码在使用 bignum 时可能出错。例如:旧代码可用 eq 判断整数相等;但引入 bignum 后,应使用 eql= 比较整数。

bignum 的取值范围受以下因素限制:主存大小、机器特性(如表示 bignum 指数的字长)、integer-width 变量。 其限制通常比 fixnum 宽松得多。bignum 与 fixnum 不会数值相等:在 fixnum 范围内的整数,Emacs 永远用 fixnum 表示,而非 bignum。

fixnum 的范围取决于机器。最小范围:−536,870,912 ~ 536,870,911(30 位,即 −2**29 到 2**29 − 1), 但很多机器支持更宽范围。

Variable: most-positive-fixnum

该变量的值是 Emacs Lisp 能处理的最大 “samll(小整数)”。典型值: 32 位平台为 2**29 − 1 和64 位平台为 2**61 − 1

Variable: most-negative-fixnum

该变量的值是 Emacs Lisp 能处理的最小 “samll(小整数)”,为负数。典型值: 32 位平台为 −2**29 和64 位平台为 −2**61

Variable: integer-width

该变量为非负整数,用于控制:当计算出超大整数时,Emacs 是否抛出范围错误。绝对值小于 2**n, (n 为该变量值)的整数不会抛出范围错误。尝试创建更大的整数时通常会报错,除非能低成本生成。将此变量设得很大,在生成超大整数时可能代价很高。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike