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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://emacs-lisp.ivory.cafe/shu-zi/untitled.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
