从简单的石碑和洞穴壁画到书面文字和留声机凹槽,人类一直在寻求记录和存储信息。在本章中,我们将描述人类最新的重大存储突破——数字计算——如何表示信息。我们还说明了如何解释数字数据的含义。
现代计算机利用各种介质来存储信息(例如磁盘、光盘、闪存、磁带和简单电路)。我们稍后将在第 11 章 中描述存储设备的特征;然而,对于本次讨论来说,介质在很大程度上是无关紧要的——无论是扫描 DVD 表面的激光还是在磁盘上滑动的磁头,存储设备的输出最终都是一系列电信号。为了简化电路,每个信号都是二进制,这意味着它只能采用两种状态之一:不存在电压(解释为零)和存在电压(解释为一)。本章探讨系统如何将信息编码为二进制,而不管原始存储介质是什么。
在二进制中,每个信号对应一个位(二进制数字)信息:零或一。令人惊讶的是,所有数据都可以仅使用零和一来表示。当然,随着信息复杂性的增加,表示信息所需的位数也随之增加。幸运的是,位序列中每增加一位,唯一值的数量就会加倍,因此 N 位序列可以表示2N个唯一值。
图 1 说明了可表示值的数量随着位序列长度的增加而增长。单个位可以表示两个值:0 和 1。两个位可以表示四个值:两个都以 0 开头的一位值(00 和 01),以及两个以 1 开头的一位值(10 和 11)。相同的模式适用于扩展现有位序列的任何附加位:新位可以是 0 或 1,并且在任何一种情况下,其余位都表示与添加新位之前相同的值范围。因此,添加额外的位会以指数方式增加新序列可以表示的值的数量。
图 1. 可以用一到四位表示的值。带下划线的位对应于来自上面行的前缀。
由于单个位不能代表太多信息,因此存储系统通常将位分组为更长的序列以存储更多有趣的值。最普遍的分组是字节,它是八位的集合。一个字节代表 28 = 256 个唯一值 (0-255) — 足以枚举英语字母和常见标点符号。字节是计算机系统中可寻址内存的最小单位,这意味着程序不能要求少于八位来存储变量。
现代 CPU 通常还将字定义为 32 位或 64 位,具体取决于硬件的设计。字的大小决定了系统硬件用于将数据从一个组件移动到另一个组件(例如,在内存和寄存器之间)的“默认”大小。这些更大的序列对于存储数字是必要的,因为程序通常需要计算高于 256 的数字!
如果您用 C 语言编程,您就会知道必须在使用变量之前声明它。此类声明告知 C 编译器有关变量二进制表示形式的两个重要属性:为其分配的位数,以及程序打算解释这些位的方式。从概念上讲,位数很简单,因为编译器只需查找与声明的类型相关联的位数(例如,char
是一个字节)并将该内存量与变量相关联。位序列的解释在概念上更有趣。计算机内存中的所有数据都以位的形式存储,但位没有 固有 含义。例如,即使只有一个位,您也可以用多种不同的方式解释该位的两个值:向上和向下、黑色和白色、是和否、开和关等。
扩展位序列的长度扩大了其解释的范围。例如,char
变量使用美国信息交换标准代码 (ASCII) 编码标准,该标准定义了八位二进制值如何对应于英文字母和标点符号。 表 1 显示了 ASCII 标准的一小部分(如需完整参考,请在命令行上运行“man ascii”)。没有什么特殊原因为什么字符“X”需要对应01011000,所以不用费心去记这个表。重要的是每个存储字母的程序都同意其位序列解释,这就是标准委员会定义 ASCII 的原因。
表 1. 八位 ASCII 字符编码标准的一个小片段
Binary value | Character interpretation | Binary value | Character interpretation |
---|---|---|---|
01010111 | W | 00100000 | space |
01011000 | X | 00100001 | ! |
01011001 | Y | 00100010 | " |
01011010 | Z | 00100011 | # |
任何信息都可以二进制编码,包括图形和音频等丰富的数据。例如,假设图像编码方案定义 00、01、10 和 11 对应于白色、橙色、蓝色和黑色。 图 2 展示了我们如何使用这种简单的两位编码策略仅使用 12 个字节来绘制鱼的原始图像。在 a 部分中,图像的每个单元相当于一个两位序列。 b 和 c 部分分别将相应的二进制编码显示为两位和字节序列。尽管出于学习目的而简化了示例编码方案,但总体思路与真实图形系统使用的类似,尽管具有更多位用于更广泛的颜色。
图 2. 简单鱼图像的 (a) 图像表示、(b) 两位单元表示和 (c) 字节表示。
刚刚介绍了两种编码方案,相同的位序列 01011010 对于文本编辑器来说可能意味着字符Z
,而图形程序可能会将其解释为鱼尾鳍的一部分。哪种解释是正确的取决于上下文。尽管底层的位是相同的,但人类经常发现某些解释比其他解释更容易理解(例如,将鱼视为彩色细胞而不是字节表)。
本章的其余部分主要讨论二进制数的表示和操作,但总体要点值得重复:所有信息都以 0 和 1 的形式存储在计算机内存中,并且由程序或运行程序的人员来解释这些位的含义。