从简单的石碑和洞穴壁画到书面文字和留声机凹槽,人类一直在寻求记录和存储信息。在本章中,我们将描述人类最新的重大存储突破——数字计算——如何表示信息。我们还说明了如何解释数字数据的含义。

现代计算机利用各种介质来存储信息(例如磁盘、光盘、闪存、磁带和简单电路)。我们稍后将在第 11 章 中描述存储设备的特征;然而,对于本次讨论来说,介质在很大程度上是无关紧要的——无论是扫描 DVD 表面的激光还是在磁盘上滑动的磁头,存储设备的输出最终都是一系列电信号。为了简化电路,每个信号都是二进制,这意味着它只能采用两种状态之一:不存在电压(解释为零)和存在电压(解释为一)。本章探讨系统如何将信息编码为二进制,而不管原始存储介质是什么。

在二进制中,每个信号对应一个(二进制数字)信息:零或一。令人惊讶的是,所有数据都可以仅使用零和一来表示。当然,随着信息复杂性的增加,表示信息所需的位数也随之增加。幸运的是,位序列中每增加一位,唯一值的数量就会加倍,因此 N 位序列可以表示2N个唯一值。

图 1 说明了可表示值的数量随着位序列长度的增加而增长。单个位可以表示两个值:0 和 1。两个位可以表示四个值:两个都以 0 开头的一位值(00 和 01),以及两个以 1 开头的一位值(10 和 11)。相同的模式适用于扩展现有位序列的任何附加位:新位可以是 0 或 1,并且在任何一种情况下,其余位都表示与添加新位之前相同的值范围。因此,添加额外的位会以指数方式增加新序列可以表示的值的数量。

With one bit, we can represent two values.  Two bits gives us four values, and with three bits we can represent eight values.  Four bits yields 16 unique values.  In general, we can represent 2^N^ values with N bits.

图 1. 可以用一到四位表示的值。带下划线的位对应于来自上面行的前缀。

由于单个位不能代表太多信息,因此存储系统通常将位分组为更长的序列以存储更多有趣的值。最普遍的分组是字节,它是八位的集合。一个字节代表 28 = 256 个唯一值 (0-255) — 足以枚举英语字母和常见标点符号。字节是计算机系统中可寻址内存的最小单位,这意味着程序不能要求少于八位来存储变量。

现代 CPU 通常还将定义为 32 位或 64 位,具体取决于硬件的设计。字的大小决定了系统硬件用于将数据从一个组件移动到另一个组件(例如,在内存和寄存器之间)的“默认”大小。这些更大的序列对于存储数字是必要的,因为程序通常需要计算高于 256 的数字!

如果您用 C 语言编程,您就会知道必须在使用变量之前声明它。此类声明告知 C 编译器有关变量二进制表示形式的两个重要属性:为其分配的位数,以及程序打算解释这些位的方式。从概念上讲,位数很简单,因为编译器只需查找与声明的类型相关联的位数(例如,char是一个字节)并将该内存量与变量相关联。位序列的解释在概念上更有趣。计算机内存中的所有数据都以位的形式存储,但位没有 固有 含义。例如,即使只有一个位,您也可以用多种不同的方式解释该位的两个值:向上和向下、黑色和白色、是和否、开和关等。

扩展位序列的长度扩大了其解释的范围。例如,char变量使用美国信息交换标准代码 (ASCII) 编码标准,该标准定义了八位二进制值如何对应于英文字母和标点符号。 表 1 显示了 ASCII 标准的一小部分(如需完整参考,请在命令行上运行“man ascii”)。没有什么特殊原因为什么字符“X”需要对应01011000,所以不用费心去记这个表。重要的是每个存储字母的程序都同意其位序列解释,这就是标准委员会定义 ASCII 的原因。

表 1. 八位 ASCII 字符编码标准的一个小片段

Binary valueCharacter interpretationBinary valueCharacter interpretation
01010111W00100000space
01011000X00100001!
01011001Y00100010"
01011010Z00100011#

任何信息都可以二进制编码,包括图形和音频等丰富的数据。例如,假设图像编码方案定义 00、01、10 和 11 对应于白色、橙色、蓝色和黑色。 图 2 展示了我们如何使用这种简单的两位编码策略仅使用 12 个字节来绘制鱼的原始图像。在 a 部分中,图像的每个单元相当于一个两位序列。 b 和 c 部分分别将相应的二进制编码显示为两位和字节序列。尽管出于学习目的而简化了示例编码方案,但总体思路与真实图形系统使用的类似,尽管具有更多位用于更广泛的颜色。

A fish image with a blue (10) background, white (00) eye, black (11) pupil, and orange (01) body. 图 2. 简单鱼图像的 (a) 图像表示、(b) 两位单元表示和 (c) 字节表示。

刚刚介绍了两种编码方案,相同的位序列 01011010 对于文本编辑器来说可能意味着字符Z,而图形程序可能会将其解释为鱼尾鳍的一部分。哪种解释是正确的取决于上下文。尽管底层的位是相同的,但人类经常发现某些解释比其他解释更容易理解(例如,将鱼视为彩色细胞而不是字节表)。

本章的其余部分主要讨论二进制数的表示和操作,但总体要点值得重复:所有信息都以 0 和 1 的形式存储在计算机内存中,并且由程序或运行程序的人员来解释这些位的含义。