3.1 整型数

整数的表示和范围。

Lisp 读取器读取一个整数并解释为十进制数字。整数可以带有可选的初始符号和可选的结尾句点。

1 ; 整数 1. 
1. ; 整数 1. 
+1 ; 也是整数 1. 
-1 ; 整数 -1。
0; 整数 0. 
-0 ; 整数 0。

以 10 为基数的整数的读取语法为 '#' 后跟一个基数指示,后跟一位或多位数字。'b'对应二进制,'o'对应八进制,'x' 对应十六进制,和 '基数r' 对应自定义基数。因此, '#b整数' 读取 二进制整数,并且 '#基数r整数' 读取自定义基数对应的的整数。基数的合法值从 2 到 36,允许的数字覆盖字符'0'——'9', 'a'——'Z'。字母大小写被忽略,切没有首字母或句号。例如:

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

要了解各种函数如何处理整数,尤其是按位运算符(请参阅按位运算),查看二进制形式的数字通常很有帮助。

在二进制中,十进制整数 5 如下所示:

…000101

(省略号 '…' 代表与前导位匹配的概念上无限数量的位;在这里,无限数量的 0 位。后面的例子也使用这个 '…' 符号。)

整数 -1 如下所示:

…111111

-1 表示为全 1。(这称为二进制补码表示法。)

从 -1 中减去 4 返回负整数 -5。在二进制中,十进制整数 4 是 100。因此,-5 看起来像这样:

…111011

本章中描述的许多函数都接受标记作为参数,来代替数字。(请参阅Markers。)由于此类函数的实际参数可能是数字或标记,因此我们通常将这些参数命名为number-or-marker。当参数值为标记时,使用其位置值并忽略其缓冲区。

在 Emacs Lisp 中,文本字符由整数表示。零和 (max-char)的值之间的任何整数(包括)都被认为是有效的字符。请参阅字符代码

Emacs Lisp 中的整数范围不受机器字节大小的限制。但是,在黑箱内部,有两种整数:较小的整数,称为fixnums,较大的整数,称为bignums。尽管 Emacs Lisp 代码通常不应该依赖于整数是 fixnum 还是 bignum,但较旧的 Emacs 版本仅支持 fixnum,Emacs 中的某些函数仍然只接受 fixnum,并且较旧的 Emacs Lisp 代码在给定 bignum 时可能会出现问题。例如,而旧的Emacs Lisp代码可以安全地用eq来比较数字,而新的Emacs中的bignums 应当使用类似eql 和 = 这样的谓词进行整数比较。

bignums 的值范围受主内存量、机器特征(例如用于表示 bignum 指数的单词的大小)以及integer-width 变量的限制。这些限制通常比 fixnum 的限制大得多。bignum 在数值上永远不等于 fixnum;Emacs 总是将 fixnum 范围内的整数表示为 fixnum,而不是 bignum。

fixnum 的值范围取决于机器。最小范围是 -536,870,912 到 536,870,911(30 位;即 -2**29 到 2**29 - 1),但许多机器提供更广泛的范围。

Variable: most-positive-fixnum

这个变量的值是 Emacs Lisp 可以处理的最大“小”整数。在 32 位平台上通常为 2**29 - 1,在 64 位平台上为 2**61 - 1。

Variable: most-negative-fixnum

这个变量的值是 Emacs Lisp 可以处理的数字最小的“小”整数。它是负面的。在 32 位平台上为 -2**29,在 64 位平台上为 -2**61。

Variable:integer-width

此变量的值是一个非负整数,用于控制 Emacs 在计算大整数时是否抛出范围错误。绝对值小于 2** n 的整数(其中n是此变量的值)不会抛出范围错误。尝试创建更大的整数通常会引发范围错误,尽管廉价地创建更大的整数,则可能不会抛出错误。如果计算产生巨大的整数,则将此变量设置为一个大的数字可能代价会高昂。

最后更新于