# 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
```

要了解各种函数如何处理整数，尤其是按位运算符（请参阅[按位运算](https://www.gnu.org/software/emacs/manual/html_node/elisp/Bitwise-Operations.html)），查看二进制形式的数字通常很有帮助。

在二进制中，十进制整数 5 如下所示：

```
…000101
```

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

整数 -1 如下所示：

```
…111111
```

-1 表示为全 1。（这称为*二进制补码*表示法。）

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

```
…111011
```

本章中描述的许多函数都接受标记作为参数，来代替数字。（请参阅[Markers](https://www.gnu.org/software/emacs/manual/html_node/elisp/Markers.html)。）由于此类函数的实际参数可能是数字或标记，因此我们通常将这些参数命名为number-or-marker。当参数值为标记时，使用其位置值并忽略其缓冲区。

在 Emacs Lisp 中，文本字符由整数表示。零和 `(max-char)`的值之间的任何整数（包括）都被认为是有效的字符。请参阅[字符代码](https://www.gnu.org/software/emacs/manual/html_node/elisp/Character-Codes.html)。

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是此变量的值）不会抛出范围错误。尝试创建更大的整数通常会引发范围错误，尽管廉价地创建更大的整数，则可能不会抛出错误。如果计算产生巨大的整数，则将此变量设置为一个大的数字可能代价会高昂。
