---
schema_version: "library-reader-v1"
source_type: "original_book"
title: "编码 隐匿在计算机软硬件背后的语言"
author: null
edition: null
publisher: null
year: null
isbn: "9787121181184"
library_document_id: "38270854-596f-4a26-8183-db8c968c6020"
source_sha256: "249786274d83909f0bddc34d77f81ed8f0b14d1eac8843c772a37a3ecbfe2cfc"
pdf_physical_page_count: 438
pdf_physical_page_index_base: 0
range_start: 70
range_count: 10
html_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020?start=70&limit=10"
markdown_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=70&limit=10"
previous_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=60&limit=10"
next_url: "https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=80&limit=10"
---

# 编码 隐匿在计算机软硬件背后的语言

> 页码规则：PDF_PHYSICAL_PAGE_INDEX 是从 0 开始的权威文件物理页索引；PRINTED_PAGE 是页面中识别出的印刷页码，可能为空，二者不得混用。

## PDF_PHYSICAL_PAGE_INDEX=70 | PRINTED_PAGE=54

位置计数系统的好处并不在于它有多么好用，而在于对非十进制的系统而言，它仍然是易于实现计数的。我们现有的计数系统并不适用于每种情况。以10为基数的数字系统最大的问题是它对于卡通人物没有任何意义。大多数卡通人物每只手（或爪子）只有4根手指，因此它们需要一个以8为基数的计数系统。而有意思的是，许多我们在十进制数中所了解到的知识同样适合卡通朋友们所钟爱的八进制计数系统。

编码隐匿在计算机软硬件背后的语言

54

## PDF_PHYSICAL_PAGE_INDEX=71 | PRINTED_PAGE=NOT_DETECTED

十的替代品

对于我们人类而言，10是一个非常重要的数字。10是我们大多数人拥有的手指或脚趾的数目，当然我们也希望所有人的手指和脚趾都是10个。因为手指非常便于计数，于是我们人类已经适应了这个以10为基数的数字系统。

就如前面章节中所提到的，我们现在所用的数字系统是基于10的数字系统的，或称为十进制。我们已经非常习惯这个数字系统了，因此起初也很难再构想出其他的数字系统。的确，当我们看到数字10的时候，我们不自觉地就会想到这个数字代表了下面这么多只鸭子：

## PDF_PHYSICAL_PAGE_INDEX=72 | PRINTED_PAGE=56

但是，数字10之所以指的是这么多只鸭子，其唯一理由就在于这些鸭子的数目与我们的手指数目相同。如果人类的手指不是10根，我们数数的方式就会有所不同，那么10就会是另外一个含义。同样，数字10可以代表这么多只鸭子：

或者是这么多只的鸭子：

甚至可以是这么多只的鸭子：

当我们认识到，10可以表示两只鸭子，我们就可以解释开关、导线、灯泡和继电器（进一步推广到计算机）是如何表示数字的了。

如果人类像卡通人物那样每只手有4根手指会怎样呢？我们可能就不会想到建立一个以10为基数的数字系统。相反我们会自然而然地、不可避免地想到建立一个以8为基数的数字系统。我们就不会称这个系统为十进制数字系统，而称之为八进制数字系统。

如果我们的数字系统是以8为基础而建立的，我们就不需要如下这个符号：

9

将这个符号给卡通人物看的话，你会得到这样的反应：“这是什么？它代表什么？”如果继续仔细考虑一下，你会发现我们连这样的一个符号也不会需要：

8

在十进制中，10没有特定的符号，因此在八进制中，同样也没有表示8的特定符号。

十进制中我们的计数方式是：0、1、2、3、4、5、6、7、8、9，然后是10。在八进制中数字系统中计数方式是：0、1、2、3、4、5、6、7，而后是什么呢？我们已经将符号用完了。在这里唯一有意义的只有10，而在这里的正确答案恰恰就是10。在八进制中，7之后的下一个数字是10。但是这个“10”代表的并不是人类手指的数量。在八进制中，“10”代表的是卡通人物手指的数量。

编码隐匿在计算机软硬件背后的语言

56

## PDF_PHYSICAL_PAGE_INDEX=73 | PRINTED_PAGE=57

如果继续用脚趾数下去的话，就是这样：

使用非十进制的数字系统时，你可以将“10”读作“一零”，这样可以避免一些混淆。类似地，“13”读作“一三”，“20”读作“二零”。要想真正避免混淆，可以将“20”读作“基于8的数二零”或“八进制二零”。

尽管已经用完了所有的手指和脚趾，但我们仍能够用八进制继续数下去。这与十进制基本相同，但是我们跳过了数字8和9。当然，相同数字所代表的数量是不同的：

0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45, 46, 47, 50, 51, 52, 53, 54, 55, 56, 57, 60, 61, 62, 63, 64, 65, 66, 67, 70, 71, 72, 73, 74, 75,76, 77, 100…

这里最后一个数字我们读做“一零零”。这是卡通人物手指的数量自身相乘所得的结果。

8 十的替代品

57

## PDF_PHYSICAL_PAGE_INDEX=74 | PRINTED_PAGE=58

当书写十进制和八进制数时，我们可以利用下标标注来区别不同数字系统，避免混淆。下标TEN表示十进制，EIGHT表示八进制。

这样，白雪公主遇到的小矮人数量是 $7 _ { \tt T E N }$ 或 $7 _ { \mathrm { E I G H T } }$

卡通人物的手指数是 ${ \tt 8 } _ { \tt T E N }$ 或 $1 0 _ { \mathrm { E I G H T } }$

贝多芬所写的交响曲的数目是 ${ \bf 9 } _ { \mathrm { T E N } }$ 或 $1 1 _ { \tt E I G H T }$

人类手指的数量是 $1 0 _ { \tt T E N }$ 或 $1 2 _ { \mathrm { { E I G H T } } } ;$

一年中的月份数是 $1 2 _ { \mathsf { T E N } }$ 或 $1 4 _ { \mathrm { E I G H T } } ;$

两个星期的天数是 $1 4 _ { \mathrm { T E N } }$ 或 $1 6 _ { \mathrm { E I G H T } }$

“情人”的生日庆祝会是 $1 6 _ { \mathrm { { T E N } } }$ 或 $2 0 _ { \mathrm { E I G H T } }$

一天中的小时数是 $2 4 _ { \mathrm { T E N } }$ 或 $3 0 _ { \mathrm { E I G H T } }$

拉丁字母表中的字母数是 $2 6 _ { \mathrm { { T E N } } }$ 或 $3 2 _ { \mathrm { E I G H T } }$

一夸脱的液体相当于的盎司数是 $3 2 _ { \mathrm { T E N } }$ 或 $4 0 _ { \tt E I G H T } ;$

一副纸牌的张数是 $5 2 _ { \tt T E N }$ 或 $6 4 _ { \mathrm { E I G H T } }$

棋盘的格数是 $6 4 _ { \Gamma \mathrm { E N } }$ 或 $1 0 0 _ { \mathrm { E I G H T } }$

日落大道上最有名的地址是 $7 7 _ { \mathtt { T E N } }$ 或 $1 1 5 _ { \mathrm { E l G H T } } ;$

美式足球场地的面积是 $1 0 0 _ { \mathtt { T E N } }$ 或 $1 4 4 _ { \mathrm { E I G H T } }$

温网首届女子单打的初赛人数是 $1 2 8 _ { \mathrm { T E N } }$ 或 $2 0 0 _ { \mathrm { E I G H T } }$

孟菲斯市的面积是 $2 5 6 _ { \mathsf { T E N } }$ 或 $4 0 0 _ { \scriptstyle \mathrm { E I G H T } }$

注意，在上面一系列的八进制数中出现了几个好整数(nice round number)，如 $1 0 0 _ { \mathrm { E I G H T } }$ $2 0 0 _ { \mathtt { E I G H T } }$ 和 $4 0 0 _ { \mathrm { E I G H T } }$ 。根据规定，在十进制中，好整数通常是指结尾有若干个零的数。在结尾有两个零的十进制数代表的是 $1 0 0 _ { \mathtt { T E N } }$ ，而 $1 0 0 _ { \mathrm { T E N } }$ 表示 $1 0 _ { \mathrm { T E N } }$ 乘以 $1 0 _ { \mathrm { T E N o } }$ 在八进制数中，结尾有两个零代表是 $1 0 0 _ { \mathrm { E I G H T } }$ ，而 $1 0 0 _ { \mathrm { E I G H T } }$ 表示 $1 0 _ { \mathrm { E I G H T } }$ 乘以 $1 0 _ { \mathrm { E I G H T } }$ (或 ${ \bf 8 } _ { \mathrm { T E N } }$ 乘以 $8 _ { \mathrm { T E N } }$ ，即$6 4 _ { \mathrm { { T E N } } } ) _ { \mathrm { { c } } }$

编码隐匿在计算机软硬件背后的语言

58

## PDF_PHYSICAL_PAGE_INDEX=75 | PRINTED_PAGE=59

你可能还会注意到，这些好整数 $1 0 0 _ { \mathrm { E I G H T } } . 2 0 0 _ { \mathrm { E I G H T } }$ 和 $4 0 0 _ { \scriptstyle \mathrm { E I G H T } }$ 在十进制中分别与 $\bf { 6 4 } _ { T E N }$ $1 2 8 _ { \textrm { T E N } }$ 和 $2 5 6 _ { \textrm { T E N } }$ 相等，它们全是2的整数次幂。这是非常有意义的。例如，400EIGHT等于 $4 _ { \tt E I G H T }$ 乘以 $1 0 _ { \tt E I G H T }$ 乘以 $1 0 _ { \mathrm { \ E I G H T } }$ ，而这里所有的数都是2的整数次幂。任何2的整数次幂乘以2的整数次幂的结果依然是2的整数次幂。

下表给出了一些2的整数次幂的十进制及其对应的八进制的表示形式。

最右列的好整数暗示我们，十进制以外的数字系统可能对使用二进制码有所帮助。

在结构上，八进制数字系统与十进制数字系统并没有什么不同。它们只是在细节上存在一些差异。例如，八进制数中的每个位所代表的值是该位数字乘以8的整数次幂的结果。

这样，一个八进制数 $3 7 2 5 _ { \mathrm { \bf ~ E I G H T } }$ 可以分解成如下形式：

$$
3 7 2 5 _ { \mathrm { \tiny ~ E I G H T } } = 3 0 0 0 _ { \mathrm { \tiny ~ E I G H T } } + 7 0 0 _ { \mathrm { \tiny ~ E I G H T } } + 2 0 _ { \mathrm { \tiny ~ E I G H T } } + 5 _ { \mathrm { \tiny ~ E I G H T } }
$$

8 十的替代品

59

## PDF_PHYSICAL_PAGE_INDEX=76 | PRINTED_PAGE=60

同样还可以写成若干种不同的形式，下面是利用十进制的8的整数次幂写出的一种形式：

$$
\begin{array} { r } { 3 7 2 5 _ { \mathrm { \tiny ~ E I G H T } } = 3 \times 5 1 2 _ { \mathrm { \tiny ~ T E N } } + } \\ { 7 \times 6 4 _ { \mathrm { \tiny ~ T E N } } + } \\ { 2 \times 8 _ { \mathrm { \tiny ~ T E N } } + } \\ { 5 \times 1 } \end{array}
$$

采用八进制形式的8的整数次幂，表现形式如下：

$$
\begin{array} { r l } { 3 7 2 5 _ { \mathrm { \tiny ~ E I G H T } } = 3 \times 1 0 0 0 _ { \mathrm { \tiny ~ E I G H T } } + } & { } \\ { 7 \times 1 0 0 _ { \mathrm { \tiny ~ E I G H T } } + } \\ { 2 \times 1 0 _ { \mathrm { \tiny ~ E I G H T } } + } \\ { 5 \times 1 } & { } \end{array}
$$

还有一种拆分形式：

$$
\begin{array} { r l r } & { } & { 3 7 2 5 _ { \mathrm { \tiny ~ E I G H T } } = 3 \times 8 ^ { 3 } + } \\ & { } & { 7 \times 8 ^ { 2 } + } \\ & { } & { 2 \times 8 ^ { 1 } + } \\ & { } & { 5 \times 8 ^ { 0 } } \end{array}
$$

如果用十进制数计算出结果，会得到 $2 0 0 5 _ { \mathrm { \scriptstyle \mathrm { ~ T E N o } } }$ 这就是将八进制数转化为十进制数的方法。

我们可以像进行十进制数的加法和乘法那样，对八进制数进行加法或乘法运算。不同的是，我们要采用不同的表来对各个数位进行乘法或加法运算。下面是八进制数的加法表。

编码——隐匿在计算机软硬件背后的语言

60

## PDF_PHYSICAL_PAGE_INDEX=77 | PRINTED_PAGE=61

例如， $5 _ { \mathrm { \scriptsize ~ E I G H T } } + 7 _ { \mathrm { \scriptsize ~ E I G H T } } = 1 4 _ { \mathrm { \scriptsize ~ E I G H T c } }$ 我们还可以将两个更长的八进制数按照与十进制相同的方法相加：

$$
\frac { 1 3 5 } { 1 0 4 3 }
$$

首先要从最右的一列开始，5加3等于10，结果为0，进位1；1加3加4等于10，结果为0，进位1；1加1加6等于 $1 0 _ { \circ }$

同样，在八进制中，2乘以2结果依然为 ${ \pmb 4 } _ { \circ }$ 但是3乘以3却不等于 ${ \mathfrak { g } } _ { \mathfrak { o } }$ 那是多少呢？在这里，3乘以3结果是 $1 1 _ { \mathrm { ~ \tiny ~ E I G H T } }$ ，其与 ${ \bf 9 } _ { \mathrm { T E N } }$ 所代表的数量相等。下面为八进制乘法的乘法表。

在这里， $4 \times 6$ 等于 $3 0 _ { \mathrm { E I G H T } }$ ，而 $3 0 _ { \tt E I G H T }$ 与 $2 4 _ { \mathrm { T E N } }$ 等价，也就是与十进制中的 $4 \times 6$ 相等。

八进制数字系统与十进制数字系统一样，都是有效的。但是让我们更进一步来看，既然已经为卡通人物开发了一套数字系统，就让我们再制订一套适合龙虾的数字系统吧。实际上龙虾根本没有手指，但是在它们前爪的末端都有鳌。适用于龙虾的数字系统是以4为基数的四进制（quaternary）数字系统。

8 十的替代品

61

## PDF_PHYSICAL_PAGE_INDEX=78 | PRINTED_PAGE=62

四进制数字系统是像这样计数的：0，1，2，3，10，11，12，13，20，21，22，23，30，31，32，33，100，101，102，103，110，等等。

这里我不打算在四进制数上花太多的时间，因为接下来我们即将转入一个更为重要的话题。通过下图我们可以看出四进制中每一位是如何跟4的某个整数次幂相对应的。

四进制数31232可以写做如下形式：

$$
\begin{array} { r l r } { 3 1 2 3 2 _ { \mathrm { F O U R } } = 3 \times 2 5 6 _ { \mathrm { T E N } } + } & { } & \\ { \phantom { \frac { 1 } { 2 } } } & { 1 \times 6 4 _ { \mathrm { T E N } } + } & { } \\ { \phantom { \frac { 1 } { 2 } } } & { 2 \times 1 6 _ { \mathrm { T E N } } + } & { } \\ { \phantom { \frac { 1 } { 2 } } } & { 3 \times 4 _ { \mathrm { T E N } } + } & { } \\ { \phantom { \frac { 1 } { 2 } } } & { 2 \times 1 } & { } \end{array}
$$

等价于：

$$
\begin{array} { c } { { 3 1 2 3 2 _ { \mathrm { F O U R } } = 3 \times 1 0 0 0 0 _ { \mathrm { F O U R } } + } } \\ { { } } \\ { { 1 \times 1 0 0 0 _ { \mathrm { F O U R } } + } } \\ { { } } \\ { { 2 \times 1 0 0 _ { \mathrm { F O U R } } + } } \\ { { } } \\ { { 3 \times 1 0 _ { \mathrm { F O U R } } + } } \\ { { } } \\ { { 2 \times 1 } } \end{array}
$$

同样可以写成：

$$
\begin{array} { r } { 3 1 2 3 2 _ { \mathrm { F O U R } } = 3 \times 4 ^ { 4 } + } \\ { 1 \times 4 ^ { 3 } + } \\ { 2 \times 4 ^ { 2 } + } \\ { 3 \times 4 ^ { 1 } + } \\ { 2 \times 4 ^ { 0 } } \end{array}
$$

编码—隐匿在计算机软硬件背后的语言

62

## PDF_PHYSICAL_PAGE_INDEX=79 | PRINTED_PAGE=63

如果以十进制数的形式计算其结果，我们会发现 $3 1 2 3 2 _ { \mathrm { F O U R } }$ 等价于 ${ 8 7 8 } _ { \mathrm { T E N } }$ 0

现在，我们要做一个跳跃并且是最远的一跳。如果我们是海豚，那么就必须用两个鳍来计数。这个数字系统称为以2为基数的数字系统，或二进制。这样的话我们似乎只有两个数字了，这两个数分别为0和1。

0和1现在已不是我们要处理的全部问题了，而我们还需要练习一下才能习惯使用二进制数。二进制数最大的问题是数字用完得很快。例如，下图就是海豚如何用它的鳍来计数的例子。

是的，在二进制中，1的下一个数字是 $1 0 _ { \circ }$ 这让人惊讶，但也并不是什么意外。无论使用哪种计数系统，当单个的数字用完时，第一个两位数就是 $1 0 _ { \circ }$ 二进制系统这样计数的：

0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111,10000,10001…

这些数看起来似乎很大，但实际上并不是这样的。准确地说，二进制数的长度增长得很快而非数值增大得快：

人类的头的个数是 ${ \bf l } _ { \mathsf { T E N } }$ 或 $1 _ { \textrm { T W O } } ;$

海豚身上鳍的个数是 $2 _ { \mathrm { T E N } }$ 或 $1 0 _ { \mathrm { { T w o } } }$

一个大汤匙中的小茶匙的数目为 $3 _ { \mathrm { T E N } }$ 或 $1 1 _ { \mathrm { \ T w o } }$

正方形的边数是 $4 _ { \mathrm { { T E N } } }$ 或 $1 0 0 _ { \mathrm { T W O } }$

人类一只手的手指数是 ${ \sf S } _ { \mathrm { T E N } }$ 或 $1 0 1 _ { \mathrm { \ T w o } }$

昆虫的腿数是 ${ \bf 6 } _ { \mathrm { T E N } }$ 和 $1 1 0 _ { \mathrm { T w o } }$

8 十的替代品

63

下一段：[继续读取](https://workshop.closeclaw.top/api/ai/read/38270854-596f-4a26-8183-db8c968c6020.md?start=80&limit=10)
