前言:此文为一篇翻译文章,水平有限翻译仅为自己更好的理解文章内容。原文请查看Data In The Computer
数据的呈现
我们都见过计算机通过声音、图片、图像、字和文本做着似乎很令人不可思议的事。似乎我们可以将一部分的现实中的世界在计算机中构建。你也许会认为这台神奇的机器构造也十分的复杂,但实际并非如此。事实上我们在现代计算机在看到的所有精彩纷呈的多媒体都是由数以百万计简单的开关构成的,但是没有什么比这些开关更复杂的东西了。关键在于如何在计算机中将所有现实中的声音、图片、数字等其他数据转化为可以在计算中用开关来表示的数据。如图一所示
图一
计算机是电子机器。 计算机使用电力进行处理与储存数据,而非通过机械部件。电力通过电线传导的非常迅速并且相比机器零部件,电子元器件有着更低的故障率。计算机中当然也有一些机械部件,比如磁盘驱动(经常是计算机发生故障的原因之一),但是磁盘内部的数据处理与存储是电子而非机械,这个过程快速且可靠(只要计算机接入了电源)。
电流可通过开关:如果开关闭合,电流流动;如果开关断开,电流则不能流动。为了在计算机中处理真实世界的数据,我们需要一个方法来表示开关的状态。在计算机中使用二进制编码系统来做这件事情。
二进制和开关 。二进制是数学上的一种数字系统: 一种计算的方式。我们都学过通过0-9十个数字来计数的方式。一个可能得因素就是我们刚好有十个手指可以用来表示数字(如果卡通人物正好有8个手指,那么自然会建立一个以8为基础的数字系统)。计算机通过开关的状态来表示数据,而开关只有两种状态:"开"和"关"。二进制有两个数字进行计数,自然很适配计算机中开关的两种状态(0表示关,1表示开)。
正如你在计算机历史部分所读到的,开关随时间的演变从而使得计算机运行的更快、价格更便宜、更加小巧。起初,开关是一个真空管(如图A所示),大概和人的大拇指一样大。20世纪60年代晶体管被发明(约翰·巴丁、沃尔特·布拉顿和威廉·肖克利 三个发明者获得1956年诺贝尔奖)。晶体管的发明使得开关的尺寸可以达到人类指甲的大小。20世纪70年代集成电路的发展使得数以百万计的晶体管可以被建造在一个与人类指尺寸相当的硅芯片上。
图A
比特与字节 一个二进制数 (0 或 1) 被当成是一个bit(比特), 这是一个二进制数的简称。因此,一个bit可以用一个开关来实现,如图二所示。
图二
在下面的表格中, 我们可以看到比特被组合成更大的块来表示数据。
0 | 1 bit |
---|---|
1 | 1 bit |
0110 | 4 bits |
01101011 | 8 bits |
由于一些原因,我们这里不深究这些。计算机设计者使用八个比特位组合作为基本的数据单元字节。一个字节由八个下图所示的开关组成,如下图三所示。
图三
计算机制造商是根据设备拥有的字节数来表示内存和存储能力 。字节数可以用千字节来表示。Kilo表示2的十次方,即1024 。千字节的缩写为KB , 或者简称为K 。千字节代表1024 个字节。 因此,一台内存为640K的计算机可以存储640x1024 或者655360 字节。内存容量也可以使用兆字节(百万字节)来表示。一兆,缩写为MB ,表示大约为100万字节。对于存储设备,制造商会用千兆字节 (缩写为GB )来表示存储的容量;千兆字节表示大约10亿字节。 较老款的个人计算机内存可能只能容纳640K字节;较新款的机器内存从1MB到32MB甚至更多。 大型主机的内存可以容纳千兆字节。现代的硬盘内存可以容纳千兆字节。
Kilo 源于希腊文khilioi,意为1000。比如1千米(kilometer)代表着1000米。1千字节并非代表1000个字节而是代表1024个字节。计算中采用的基于2的幂的计算系统,而常见的公制系统是基于10的幂的计数系统。10的幂为10、100、1000,而2的幂为2、4、8。因为210 ≈ 103,所以把1024字节的存储空间用1千字节来表示。
用字节来表示数据
一个字节可以用来表示许多不同类型的数据。实际表示什么样的数据取决于计算机如何使用该字节 ,这点非常重要需牢记于心。
例如,这个字节
01000011
可以用来表示67这个整数、字符C、声音的第67个分贝等级、图片中一个点的模糊程度为第67等级、一个向计算机发出的指令,如"移动到内存",以及一些其它的数据类型。
整数 。整数通过二进制计算来表示。
思考一下我们是如何通过十进制计算的。我们从0开始,每计入一个新的数,就得到下一个十进制数。当我们达到十进制数的最后一位(9)时,我们使用两字数字来计数,将一个数字放到"十位"上,然后在这个"十位"上使用0-9是个数字重新开始计数。因此,十进制数 10 "十位"为1,"个位"为0。十进制数11"十位"为1,"个位"为1,其他十进制数以此类推。如果我们需要三位数,比如 158,我们使用需要在"百位"使用第三个数字。
我们在二进制中计算也与👆🏻的十进制类型,只是二进制中只能使用两个数字0 和 1。所以我们从0开始,然后1,在往后我们就用完了这两个数字,因此,我们需要使用两个数字以便计数。我们通过在"二位"放一个1,通过两个数字来实现计数。因此二进制中用10
(121 + 0 20)来表示2,"二位"上为1,"个位"上为0。二进制数11
,"二位"上为1,"个位"上为1。10
、11
两个二进制数,让我们再次使用完了数字。因此,当用二进制数100
来表示4,"四位"上为1,"二位"上为0,"个位"上为0。
使用哪些"位 "取决于计数系统。 在我们的十进制系统中,我们使用10的幂。10的0次方为1,所以计数从"个位"开始。10的1次方为10,所以在紧挨"个位"的左边位置"十位"继续计数。10的2次方为100, 所以在紧挨"十位"的左边位置"百位"继续计数,以此类推。 根据前面的10进制系统所示,二进制"个位"为2的0次方,"二位"为2的一次方,"四位"为2的2次方,"八位"为2的3次方,以此类推。
当你查看一个字节, 最右边的为是"个位"。紧挨个位的下一个位为"二位",第三个位是"四位",第四个为是"八位"以此类推。所以,当我们说👇🏻下面这个字节时:
01000011
代表十进制的整数67,我们通过1个1在"个位",1个1在"二位"(2的一次幂),一个1在"64位"(2的6次幂),将120 + 1 21 + 1*26,总计累加得到值为67。一个字节能表示的最大十进制整数如下
11111111
128+64+32+16+8+4+2+1 = 255(26 + 24 + 24 +23 + 22 + 21 + 20 = 255)。 因此,一个字节存储的最大整数为255。计算机使用几个字节组合来存储比255更大的整数。
下面的表格展示更多的二进制计数
十进制中的数字 | 十进制的数字用二进制来表示 |
---|---|
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
字符 。计算机还可以使用单个字节来表示字符。 但是具体哪些特定的比特位集合与哪个字符一一对应呢?理论上, 我们可以编制自己的定义,声明具体的比特组合代表哪些特定的字符。毫无疑问,这就像每个人都说自己的特殊的语言一样不切实际(每个人都说不同的语言进行沟通)。由于,我们需要与计算机交流,需要人与人之间的彼此交流,因此使用一个同样的方案用于数据表示是比较合适的。也就是说,必须就哪些比特集合代表哪些字符达成一致协议。
这个编码命名为ASCII (读作 "AS-key"),ASCII即美国信息信息交换标准代码(American Standard Code for Information Interchange) , 使用7个比特位来表示一个字符。即恰好有128由种七个比特位构成的组合,这七个编码组合只能用来表示字符。更常见的版本是ASCII-8 ,也被称为扩展ASCII ,它用8个比特位组合来表示每个字符,可以用来表示256个不同的字符。例如, 大写字母A用01000001
来表示。ASCII编码作为编码标准已经被美国政府府采纳,并在各种计算机中使用,特别是迷你计算机和微型计算机。 下表展示了部分ASCII-8 编码:
如果你真的感兴趣,这里有完整的ASCII-8表格。
因此,当你在在键盘输入一个字符"C",键盘和计算机的电路将字符传转化为如下字节:
01000011
并将字母存储在计算机内存中,并指示显示器显示这个字母。图四展示了转换ASCII码,图五展示了字节通过计算机处理器进入内存。
图四
图五
如果键入一个字"CAB", 将会在计算机内存展示如下表格所示的三个三个字节。
01000011 | C |
---|---|
01000001 | A |
01000010 | B |
图像和图形数据 。你或许见过被放大了很大的照片或是以比较近的距离查看。你可以观察照片是由许多彩色的点组成的大网格(如图B所示)。计算图形数据如图片、电影一帧一帧画面、绘图或是一帧一帧的动画、都是像素网格来显示的。 "像素" picture element 的缩写。在简单的图形中(没有太多的颜色),一个字节可以用来表示一个像素。一个灰阶(Gray scale)的图形中(如图C所示),每个像素从最暗黑色到最亮的白色不同灰度之间的渐变。由于八个字节可以存储256个不同的整数(0-255),一个字节表示的像素可以是256个不同的灰度之一(通过0表示白色,255表示黑色)。现代的视频游戏和色彩纷呈的图形使用多个字节来表示每个像素(任天堂64使用八个字节 64位来表示每个像素,一以得到海量可能的颜色组合)。一个字节或是一组字节表示一个像素,因此扫描的照片或是计算机绘图被存储了成千上万个字节。如图六所示]
图A
图B
我们了解,计算机制造商联合制定了字符表示标准(ASCII码)。对于图形,也有几个类似的标准或是规格。
互联网上常见的两种两种照片格式JPEG和GIF。和ASCII码一样,约定将常见的像素编码统一为特定的字节。
图六
用字节表示程序数据。自然界的声音以模拟波的形式出现,如图七所示。
图七
大多数现代的电子扬声器,即使用电子的方式重现声音也会产生模拟波纹。然而,正如我们所见,计算机中所有的数据都是数字的,必须以字节的方式对数字进行处理。将模拟数据,比如声音转化为数字,这个过程被称为模拟到数字转换。许多音乐CD从原来老的模拟录音磁带转换为数字形式,存储在CD上(CD是数字数据;只是一组比特,一个小孔印记代表1,没有孔代表0。)现在的音乐CD是在录音设备中完成了模拟数字转换,与原来的方式相比有更好的转换效果。
为了将模拟波转换为数字形式。转换器使用了一种为称为采样 的过程。他们使用一个有规律的时间间隔(通常为几分之一秒)对声波的高度进行采样。如果使用一个字节来保存模拟波形的样本,那么这个波形有256种不同的高度(0表示最低的高度,1表示最高的高度)。这些高度代表声音的分贝等级。因此,一个头口语可能就占据几百个字节,每个字节样本都是对声音波形在几分之一秒内的采样。如果将100个字节传送到计算机的扬声器,这个头口语(的声音)就会复现。
就像字符的ASCII码和图片的GIF和JPEG,声音也有好几种商定的格式用来字节来表示。WAV是一个在互联网常见的声音格式。
用字节表示程序数据 。当你购买一款光盘或是软盘上的软件时,你得到的是一组计算机指令,这些编写的指令用来告诉计算机执行编写好的既定任务。每个指令都是一个字节,或是一小组字节。如果计算机使用一个字节表示一个指令,最多高达256项指令。后面我们将看到这些指令是什么,但是就目前而言你应该意识到一个字节也可以用来作为一个计算机指令。将指令转化为字节如图八所示。程序的处理允许人们以使用英文编写指令。一个被称为编译器 的软件程序讲英文文本转换为计算机能够理解的指令字节。如图九中所示
像其他类型的数据一样,计算机指令也有约定的格式。Mac计算机程序不能在PC(基于英特尔)本地上被兼容运行的原因之一就是Mac和英特尔PC使用了不同的字节编码格式来编写指令。
图八
计算机如何知晓字节代表什么?
我们已经见过这个字节:
01000011
可以表示整数67,字符'C',亮度为67的像素,声音为67分贝等级的采样,或者是一个指令。字节还可以用来表示其它类型的数据。如果一个字节可以用来表示多种类型的数据,那么计算机是如何知道这一点的?答案是计算机根据字节的前后文来判断。如果发送字节给扬声器,就会产生第67等级的声音。如果发送字节给显示器或是打印机,就会显示亮度为67的像素点,等等,以此类推。更准确的说,如果字节采用了标准编码技术,比如字符使用ASCII码,图片使用GIF编码,声音使用WAV编码,那么当计算机发送指令给设备,设备就会根据编码生成对应的数据。
参考资料:
编码
- 第七章:我们的十个数字
- 第八章:十的替代品
- 第九章:二进制数
- 第十五章:字节与十六进制
- 第十六章:存储器组织