我们都知道计算机底层采用的是二进制码,即计算机底层存储的全都是0和1,不管是我们看到的视频、图片、音乐、文档和其他任何存储在电脑上的文件,其底层都是0,1,那么为什么要采用0和1来进行存储呢?这些0和1在计算机底层又是如何存储的呢?0和1又是如何变成我们需要的文件呢?
我们知道计算机底层都是靠CPU来进行运算的,CPU的发展经历了如下几个过程,如图所示:
也就是说CPU最原先是通过二极管发展而来,我们可以把这些二极管看做是一个一个的开关,这些开关只有两个状态:通(1)、断(0),那么1个二极管能够表示几种状态呢?很明显就两种,0和1。
2个二极管可表示4个状态:
00,01,10,11
3个二极管可表示8个状态:
000,001,010,011,100,101,110,111
4个二极管就可表示16个状态,5个表示32个状态,6表示64个状态…一个CPU拥有的晶体管越多,电流在一个时间单位上流动的分支越多,从宏观上讲,可以在CPU上处理的数据越多,机器就越快。目前CPU都集成了超大规模的集成电路,多大呢?早在2012年Intel发布的Core i7处理器的芯片集成度达到了14亿个晶体管,数据计算能力可想而知。
就简单而言,这些晶体管就是微型的电子开关,它们是构建CPU的基石。当计算机从内存中读取到指令后(0、1),将其转换为电信号,1则表示高电频,0则表示低电频,通过一些与门,或门,与或门等逻辑控制电路。而计算机内部有超大规模的集成电路,也就可以接受非常庞大规模的数据进行计算,把处理好的数据通过同样的方式将这些信号进行转换写进内存、然后再写出磁盘、麦克风、显示器等外部设备。
Tips:计算机相关的硬件设备(以及各项电子设备)的工作原理涉及到电路、模拟信号、数字信号、计算机组成原理等诸多计算机/电子信息等专业课程,不在本书研究范围内,大家有兴趣可以自行查看相关书籍的内容来了解这部分知识。到目前为止,我们只需要大致了解到CPU内部是一块超大规模的集成电路板(虽然远不止这么简单),并且能进行计算即可。
那么计算机中存储的二进制是如何转变为我们看到的内容呢?
这中间就存在一个编码与解码的过程,其实我们在计算机中打开任何的一个文件、应用程序、游戏等其实都可以看做是一个解码的过程,只不过对应的解析器不同罢了。
以最普通的文本为例,我们跟计算机双方约定好当在键盘上输入一个字母A时,保存到电脑上的内容就为0100 0001,当我们在电脑上输入一个字母B时,电脑底层存储的就是0100 0010,越来越多的信息需要通过编码存储到计算机内,因此编码表这个概念就出来了,世界上的一些权威组织就开始着手于编码的制作,有了编码表我们就能够使用0和1来代表世间上的万物了。编码表就相当于一个翻译官,充当人类与计算机之间的一个翻译官。
当我们打开计算机中的记事本输入内容后保存到文件时,过程如图所示:
当我们打开计算机中的记事本查看文件中的内容时,过程如图所示:
市面上有非常多的编码表,每个表码表的编码内容以及规则是不一样的,因此我们存储到计算机时采用的编码表应该与我们取出数据解码时的编码表一致。
目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式。
ASCII第一次以规范标准的型态发表是在1967年,最后一次更新则是在1986年,至今为止共定义了128个字符(标准ASCII码),当初的设计并没有考虑欧洲那些扩展的拉丁字母,也没有考虑韩语和日语和中文汉字等。因此各个国家开始着手制定自己的字符编码,例如 ISO/IEC 8859(欧洲字符集)、shift_Jis(日语字符集)、GBK(中文字符集)等。
一般的外国人用的数字和字母有限,根据ASCII表来编码,1个字节可以表示完全。我们中国人大部分用的是汉字,所以引入了GB2312编码表,国标(6000多个汉字),一个汉字用2个字节表示。随后又扩展了GBK,扩展编码,能够达到几万个汉字。例如在ASCII编码表中,“65(十进制)”代表字母“A”,在GBK编码表中“CED2(十六进制)”代表中文汉字“我”。
下表是标准ASCII编码表中规范的部分字符内容:
二进制 | 十进制 | 字符 |
---|---|---|
0100 0001 | 65 | A |
0100 0010 | 66 | B |
0100 0011 | 67 | C |
0100 0100 | 68 | D |
0100 0101 | 69 | E |
0100 0110 | 70 | F |
0100 0111 | 71 | G |
下表是GBK编码表中规范的部分字符内容:
二进制 | 十六进制 | 字符 |
---|---|---|
10110100 11110011 | B4F3 | 大 |
10111100 11010010 | BCD2 | 家 |
10111010 11000011 | BAC3 | 好 |