本节书摘来自异步社区《计算机科学概论(第12版)》一书中的第1章1.1节位和位存储,作者【美】J. 格伦•布鲁克希尔(J. Glenn Brookshear) , 丹尼斯•布里罗(Dennis Brylow),更多章节内容可以访问云栖社区“异步社区”公众号查看。
第1章 数据存储
计算机科学概论(第12版)
在本章中,我们学习有关计算机中数据表示和数据存储的内容。我们要研究的数据类型包括文本、数值、图像、音频和视频。除了传统计算外,本章的很多内容还涉及数字摄影、音频/视频录制和复制,以及远程通信等领域。
本章内容
1.1 位和位存储
1.2 主存储器
1.3 海量存储器
1.4 用位模式表示信息
*1.5 二进制系统
*1.6 整数的存储
*1.7 小数的存储
*1.8 数据与程序设计
*1.9 数据压缩
*1.10 通信差错
在计算机科学中,我们首先要学习的是,信息是如何编码并存储在计算机中的。我们第一步要讨论的是计算机数据存储设备的基础知识,然后研究如何对信息进行编码并将其存储到这些系统内。最后我们将探讨现今数据存储系统的各个分支,以及如何用数据压缩和错误处理这样的技术来克服它们的不足。
1.1 位和位存储
在现今的计算机中,信息是以0和1的模式编码的,这些数字称为位(bit,是binary digit的简写,意思是二进制数字)。尽管你可能倾向于把它们与数值联系在一起,但它们的确只是些符号,其意义取决于正在处理的应用:它们有时表示数值,有时表示字母表里的字符和标点符号,有时表示图像,还有时表示声音。
1.1.1 布尔运算
为了理解单个的位在计算机中是如何存储和操作的,这里我们假设位0表示假(false),位1表示真(ture)。为了纪念数学家乔治·布尔(George Boole,1815—1864),处理真/假值的运算被称为布尔运算(Boolean operation)。乔治·布尔是逻辑数学领域的先驱。3个基本的布尔运算是AND(与)、OR(或)和XOR(异或),图1-1概述了这三种运算。(我们之所以用大写字母来表示这些逻辑运算符的名字,是为了与它们对应的英语单词区分开来。)这些运算类似于算术运算的乘法和加法,因为它们都是结合一对值(运算输入),得出第三个值(运算输出)。不过,与算术运算不同的是,布尔运算结合的是真/假值,而不是数值。
布尔运算AND可用于计算,连接词AND和两个较小或较简单的语句组成的一条语句的真/假值。这种语句的一般形式如下:
P AND Q
其中,P代表一个语句,Q代表另外一个语句。例如:
克米特是一只青蛙 AND 佩吉小姐是一位演员
AND运算的输入是复合语句分句的真/假值,输出则是复合语句本身的真/假值。因为P AND Q语句的值只有在其两个分句都是真时才为真,所以可以得出结论:1 AND 1的输出应该是1,而其他所有情况的输出值都应该是0,如图1-1所示。
![232c391b25d87580a2f6caf7bb3666bf5b1cd620](https://i-blog.csdnimg.cn/blog_migrate/8c2e5caab2fc4a480792376d9366003b.png)
同理,OR运算是建立在如下形式的复合语句的基础之上的:
P OR Q
其中,同样,P代表一个语句,Q代表另外一个语句。当其中至少有一个分句为真时,语句才为真,如图1-1所示。
英语中没有可以单独表示XOR运算含义的连词。当两个输入一个为1(真),另一个为0(假)时,XOR运算的输出为1(真)。例如,P XOR Q语句的意思是“或者是P,或者是Q,但不会是两个共存。”(简言之,当两个输入不同时,XOR运算的输出为1。)
NOT(非)运算是另一个布尔运算。它与AND、OR和XOR不同,因为它只有一个输入。它的输出值与输入值是相反的;如果NOT运算的输入值为真,那么它的输出值就为假,反之亦然。因此,如果NOT运算的输入是下面语句的真/假值:
Fozzie is a bear.
那么,其输出就是下面语句的真/假值:
Fozzie is not a bear.
1.1.2 门和触发器
门(gate)指的是一种设备,给定一种布尔运算的输入值,门可以得出该布尔运算的输出值。门可以通过很多种技术制造出来,如齿轮、继电器和光学设备。现在的计算机中,门通常是由小型电子电路实现的,其中数字0和1由电压电平表示。不过,我们不需要关注这些细节问题。对于我们来说,知道如何用门的符号形式来表示门就足够了,如图1-2所示。注意,与门、或门、异或门和非门,是由不同形状的符号表示的,输入值在一边,输出值在另一边。
![e89ce5677a00f89ace7dbf53ffc262eead870d44](https://i-blog.csdnimg.cn/blog_migrate/ddd50eff88f0a1ad23bbd999c4a0bf39.png)
门为构造计算机提供了构件。计算机构造的一个重要步骤如图1-3的电路所示,这个电路是触发器(flip-flop)电路的一个特例。触发器是计算机存储器的基本部件,它是一个可以产生0或1输出值的电路,它的值会一直保持不变,直到有另一个电路过来的临时脉冲(临时变成1之后再变为0)使其变换成其他值。换句话说,通过设置,可以让输出在外界刺激的控制下“记住”0或者1。例如,在图1-3中,只要电路的两个输入值一直都是0,输出值(无论是0还是1)就不会变。不过,在它的上输入端临时放置一个1,会强制其输出值为1;反之,在它的下输入端临时放置一个1,会强制其输出值为0。
![54c132f20ceae7f8ed00e26b3021802991bdc462](https://i-blog.csdnimg.cn/blog_migrate/fcc3ee9a83e8b477cfe31b71486deaea.png)
我们来仔细研究一下这个问题。在我们不知道图1-3中电路的当前输出值的情况下,假设上面的输入值变为1,而下面的输入值仍为0(见图1-4a),那么不管或门的另外一个输入值是什么,它的输出值都将为1。接着,因为与门的另外一个输入值已经为1(触发器下输入端为0时非门的输出值),所以它的两个输入值都为1。于是,与门的输出值变成1,这意味着,现在或门的第二次输入值将为1(见图1-4b)。这样就可以确保即使触发器上面的输入值变回0(见图1-4c),或门的输出值也会保持为1。总之,触发器的输出值已经为1,上面的输入值变回0后,其输出值仍然保持不变。
![d6af2fe8b0773b1c749e7ae2dc33ca0f33b6522e](https://i-blog.csdnimg.cn/blog_migrate/5cc360f1d2637b0a8326b5d2d9ed88f2.png)
同理,在下输入端上临时放置数值1,会强制触发器的输出值为0,而且输入值变回0后,输出值仍然保持不变。
我们介绍图1-3和图1-4中的触发器电路的目的有3个。第一,展示设备是如何通过门制造出来的,这是一个数字电路的设计过程,是计算机工程领域的一个重要课题。事实上,在计算机工程中,触发器只是诸多基础工具电路中的一种。
第二,通过触发器的概念为抽象和抽象工具的使用提供一个例子。事实上,还有很多其他的构建触发器的方法。其中一种方法如图1-5所示。如果你用这个电路做实验就会发现,尽管它有着不同的内部结构,但它的外部特性与图1-3中的是一样的。计算机工程师不必知晓触发器中实际使用的是哪种电路,只需理解触发器的外部特性并将其作为一个抽象工具来使用即可。一个触发器和其他定义良好的电路一起形成了一个构件集合,工程师可以直接利用这个构件集合构造更复杂的电路。因此,计算机电路的设计就会呈现一种层次结构,其中每一层都将较低层次的构件作为抽象工具使用。
![10fe6a4193cc2ce3485f495723950c3f08678a06](https://i-blog.csdnimg.cn/blog_migrate/d139c58245fb91f91a73e50ac1357e2a.png)
第三,触发器是现代计算机中存储二进制位的一种方法。更确切地说,可以将触发器的输出值设置为0或1。其他电路可以通过向触发器的输入端发送脉冲来调整这个值,还有一些电路可以通过将这个触发器的输出用作它们的输入来响应存储的值。因此,许多触发器(被构造成非常小的电子电路)可以用作计算机内部记录信息的一种方法,将信息编码成0和1的模式。实际上,众所周知的超大规模集成(very large-scale integration,VLSI)技术支持将数百万个电子元件构造在一个称为芯片(chip)的晶片上,从而创建出包含数百万个触发器及其控制电路的微型设备。因此,这些芯片被用作构建计算机系统的抽象工具。事实上,在某些情况下,还可以用超大规模集成技术在单块芯片上创建整个计算机系统。
1.1.3 十六进制记数法
当我们考虑计算机的内部活动时,必须考虑位模式(也叫位串)的处理问题,有些位串相当长,长位串常被称为流(stream)。不幸的是,人脑很难理解流。即便只是抄录位模式101101010011也会令人厌烦,而且容易出错。因此,为了简化这种位模式的表示方法,我们常使用一种称为十六进制记数法(hexadecimal notation)的简写符号,它是利用机器位模式的长度为4的倍数这样一个事实制定的。具体来说就是,十六进制记数法用一个符号表示位模式的4位。例如,一个12位的串只需要3个十六进制符号就可以表示。
图1-6展示了十六进制编码系统。左边一列是所有长度为4的位模式,右边一列是十六进制记数法使用的符号,表示左边那列位模式。使用这个系统,位模式10110101可以表示为B5。具体方法是,把位模式拆分为长度为4的子串,然后用十六进制的符号代替每一个子串,即用B来表示1011,用5来表示0101。同理,16位模式1010010011001000可以简化成更易为人接受的形式A4C8。
![b97e8d14573a5ba07ae15d7e41adb2b2a7e9aae1](https://i-blog.csdnimg.cn/blog_migrate/5690e8e7694a696b291a27fae2fbff2d.png)
第2章将广泛使用十六进制记数法,由此你就能体会到它的效率。
问题与练习
1.什么样的位模式输入可以使得下面的电路输出值为1?
![c40b91ccb559400769fc1c86c05e4a6c2deff82a](https://i-blog.csdnimg.cn/blog_migrate/cd134a4b5f7b5abe6ceddba06d68fec2.png)
2.对于图1-3中的触发器,我们在文中强调,下输入端放置1(同时保持上输入端为0),会迫使触发器的输出为0。描述一下这种情况触发器内部的活动序列。
3.假定图1-5中的触发器的输入都以0开始,描述一下当上输入端被临时设为1时所发生的活动序列。
4.a.如果一个与门的输出值传递给了一个非门,那么这个组合电路计算的布尔运算称为与非(NAND),当且仅当两个输入值都为1时,输出值为0。与非门的符号和与门的符号类似,只是输出有一个圆圈。下面的电路包含一个与非门。这个电路完成的是什么布尔运算?
![8481bba8f8d76ed7f5d2d52476a819b3f93310f3](https://i-blog.csdnimg.cn/blog_migrate/b440476fee155dd83cb4b8ce9b029fbf.png)
b.如果一个或门的输出值传递给了一个非门,那么这个组合电路计算的布尔运算称为或非(NOR),当且仅当两个输入值都为0时,输出值为1。或非门的符号和或门的符号类似,只是输出有一个圆圈。下面的电路包含一个与门和两个或非门。这个电路完成的是什么布尔运算?
![b17380cbff7a76a799243faedf18581ded26eb0f](https://i-blog.csdnimg.cn/blog_migrate/9a1dada002d7405f1184b97207c30837.png)
5.用十六进制记数法来表示下面的位模式。
a. 0110101011110010 b. 111010000101010100010111 c. 01001000
6.下面的十六进制模式表示的是什么位模式?
a. 5FD97 b. 610A c. ABCD