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 进制读取 integer。radix 的值合法进制范围: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), 但很多机器支持更宽范围。
该变量的值是 Emacs Lisp 能处理的最大 “samll(小整数)”。典型值: 32 位平台为 2**29 − 1 和64 位平台为 2**61 − 1
该变量的值是 Emacs Lisp 能处理的最小 “samll(小整数)”,为负数。典型值: 32 位平台为 −2**29 和64 位平台为 −2**61
该变量为非负整数,用于控制:当计算出超大整数时,Emacs 是否抛出范围错误。绝对值小于 2**n, (n 为该变量值)的整数不会抛出范围错误。尝试创建更大的整数时通常会报错,除非能低成本生成。将此变量设得很大,在生成超大整数时可能代价很高。