
1.2.4 信息的存储与编码
1.信息的存储
在计算机内部,各类信息均加以二进制编码,然后进行进一步的存储、处理。信息量的大小通过以下所介绍的信息单位加以表示。
(1)位(bit)
位是计算机中最小的数据单位,如二进制数0101100为7位,用bit表示位。
(2)字节(byte)、千字节(KB)、兆字节(MB)、吉字节(GB)、太字节(TB)
八位二进制数称为一个字节,即1byte=8bit,通常用B表示字节。字节是信息存储中的最基本单位。由于字节单位还太小,因此又定义了千字节、兆字节、吉字节和太字节几个常用单位,它们之间的数量关系如下:
1KB=1024B 1MB=1024KB
1GB=1024MB 1TB=1024GB
(3)字(word)与字长(word length)
字又称计算机字。字是计算机作为一个整体来处理数据的一组二进制数,通常一个字包含一个或多个字节。字长是一个字所包含的二进制数的位数。平时我们所说的8位机、16位机、32位机、64位机,就是指字长分别是8位、16位、32位、64位的计算机。一般来说,字长越长,计算机处理数据的能力也越强、其性能也越好。计算机的字长取决于数据总线的宽度,数据总线一般由8、16、32或64根导线和电路组成。
2.信息的编码
(1)数值数据的编码
计算机能够完成哪些运算呢?计算机能够完成以下运算:
①算术运算:加(+)、减(-)、乘(*)、除(/)。乘方、开平方根、绝对值等运算都是在基于以上基础。
②关系运算:大于(>)、等于(=)、小于(<)、大于等于(>=)、小于等于(<=)、不等于(≠)等关系运算。
③逻辑运算:与(and)、或(or)、非(not)运算。
从设计的角度考虑,计算机对于每种运算都设计对应的器件,那么CPU就太复杂了,成本也将大大地提高。在实际设计中,CPU内部用于运算的核心部件其实只有一个加法器,只能做加法。减法、乘法、除法都是通过加法来实现的。
现介绍几个基本概念:
●真值:一个以二进制形式表示的真实值,是一个理想概念下的数值,在计算机中一般无法得到。
●机器数:一个数值数据以二进制形式保存在计算机内,称为机器数。机器数有两个特点:一是符号数字化,通常最高一位是符号位,“0”表示正数,“1”表示负数,如八位二进制机器数00000001表示+1,而二进制机器数10000001表示-1;二是其数的大小受机器字长的限制。机器数有固定的位数,具体和机器有关。如现在使用的计算机都是64位计算机,那么这个机器数通常是64位。机器数分为原码、反码、补码三种表示形式。
●原码:符号位用“0”和“1”表示正、负,数值部分就是该数的二进制绝对值。
●反码:将原码中的除符号位的所有位取反,就是反码,但是计算机中正数的反码和原码相同,只有负数才将数值位取反。例如,原码+3的二进制数(00000011)B对应的反码还是(00000011)B,而原码是-3的二进制数(10000011)B对应的反码是(11111100)B。
●补码:在补码表示中,正数的补码表示和原码相同,负数的补码是在反码的最低有效位上加1,用[x]补表示。
补码在计算机中具有重要的意义,正因为有补码,计算机可以将减法运算用加法运来代替,使得CPU只要有加法器就可以进行算术运算。补码到底有什么意义呢?实际补码的计算和位数有关,或者说和表示数据的权值有关。
例如,6的十进制的权是10,所以6的补码是10-6=4,也就是说4是6的补码,也可以说6是4的补码,现在用加法来完成减法运算,如8-6=2,将所有的数都用补码表示,步骤如下:
8是正数,所以补码是8,
-6的补码是4,
计算8-6=8+[6]补=8+4=12
因为我们的权值是10,所以高位1去掉,最后的答案是2。
我们再看一个2位数的十进制运算12-23=-11怎么用加法来计算呢?在这里的权值是100。
正数12的补码是12。
[-23]的补码是100-23=77。
计算:12-23=12+[23]补=12+77=89
因为这个答案是负数(注意:这里我们没有对符号进行运算,权且认为是负数),所以还要对89再取补码,[89]补=100-89=11,所以最后的结果是-11。
再例如二进制的补码运算,为了简单,选取二进制的位数是4位,这样便于计算权值。例如,要计算12-4,对应的二进制机器数原码为:01100-00100,可以认为是01100+10100;这里最高位是符号位,现在使用补码进行运算,步骤如下:
[01100]补还是01100(正数的补码和原码是一样的).
[10100]补怎么求呢?因为是4位二进制,所以权值是16,所以[-4]补=16-4=12,对应的二进制是1100,所以[-4]补对应11100,最高位是符号位。注意补码1100正好是0100取反加1的结果,所以二进制的补码计算可以使用取反加1的方法来计算,符号位不变。
计算:01100+11100

显然,最后的符号位为0,被进位修改了,这是一个正数,答案正好是8,12-4=8。如果是8-12的4位二进制,01000-00100=01000+10100的结果会如何呢?+8的二进制补码01000,-12的二进制补码10100。计算:8-12相当于01000+10100

由于最高一位是1,所以最后的答案还要再取补码得到原码,11100的补码是10100,正好是-4。
结论:由上面的例子可以看出,补码的运用大大简化了计算机运算部件的设计,在计算机中只要设计加法器,就可以做加减法运算,而乘除法运算可以用移位运算和加法运算实现。可见计算思维的实际应用价值巨大。
(2)字符型数据的编码
在计算机中,对非数值的信息(如文字、声音等)进行处理时,须对其先进行数字化处理,也即用二进制编码来表示文字和符号等信息。对文字和符号进行二进制编码称为字符编码。字符编码涉及信息在计算机内部的表示、交换、处理和存储等问题,一般都是以国家标准或国际标准加以实行的。
①ASCII码。ASCII码是“美国信息交换标准代码”(American Standard Code for Information Interchange)的简称目前国际上最为流行的英文字符信息编码方案。ASCII码包括0~9十个数字、大小英文字母及专用符号等95种可打印字符,另外还有33种控制字符(如回车符、换行符等),如表1-4所示。
表1-4 七位ASCII代码表

ASCII码有以下几个编码特点:
●ASCII码中的每个字符用7位二进制表示,其排列次序为D6D5D4D3D2D1D0;而在计算机内部一个字符实际占用8位二进制位,其最高位D7为“0”。在数据传输过程中需要奇偶校验时,D7可用作校验位。例如,大写英文字母Z的ASCII码为1011010,而空格键SP的ASCII码为0100000,转换为十进制的编码值为32。
●ASCII码是128个字符所组成的字符集。其中编码值0~31(0000000~0011111)是不可印刷的符号,通常称为控制符,也即用于计算机通信中的通信控制或对计算机设备的功能控制。编码值32是空格字符SP,编码值为127(1111111)是删除控制DEL码,其余94个字符为可印刷字符。
●阿拉伯符号0~9的高3位编码为011,低四位编码为0000~1001,低四位的二进制形式就是0~9的对应,这既有利于排序需要,又有利于在ASCII码与二进制码之间的转换。
●英文字母的ASCII码值满足正常的字母排序要求,大小写字母的编码差别仅在于D5位的值为0还是为1,这有利于大小写字母之间的编码转换。
②EBCDIC码。EBCDIC码(Extended Binary-Coded Decimal Interchange Code,扩展的二-十进制交换码)主要用在IBM公司的计算机中,该码采用8位二进制表示,因此有256个编码状态。
(3)中文信息编码
在计算机中,为了解决汉字的输入、处理及输出问题,设计了三套对应的汉字编码方案,分别为输入码、机内码、输出码。
①输入码。汉字编码就是给汉字规定一种便于计算机识别的代码,使每一个汉字唯一地对应于一个数字串或符号串,从而把汉字输入计算机。输入码主要有四种编码方式:数字码、音码、形码、音形码。根据输入码输入到计算机的字符还要转换成机内码,计算机才能够对字符进行处理。
●数字码:汉字数量大、字形结构复杂、同音字和异体字多,对其编码的复杂程度比字符编码大得多,又由于一个字节中最多可以表示256个编码,因此一个字节无法表示众多的汉字编码。因为两个字节最多可以表示65535个字符,所以,汉字编码采用双字节保存,即一个汉字用两个字节来表示。目前通用的汉字编码有两种:国标码(GB—2312—1980),即简体字的标准编码;大五码(BIG 5)是台湾制定的汉字编码方法,类似于大陆的国标码,主要用于繁体字的表示;四角号码编码是新华字典中使用的编码方法。
国标码是国家标准汉字编码的简称(Chinese Character Standard Exchange Code)。为了解决汉字的编码问题,国家标准局于1980年公布了标准汉字编码,其标准号为GB 2312—1980,在此标准中共含有7445个,其中6763个简化汉字,还有西文字母、数字、标点符号等682个非汉字符号。国标码规定一个汉字由2个字节代码表示,每个字节只使用低7位,最高位都置0,共计可表示27×27=16384个汉字。
在国标GB 2312—1980中,国标码除了用双七位二进制表示外,还可以表示为区位码的形式。国标码采用每个字符用两个字节的低7位表示,由于每个字节有34种字符起控制作用,所以每个字节只能表达128-34=94个编码,两个字节可以表示94×94=8836种不同的字符。
四角号码编码,采用新华字典中的四角号码的方式,将一个汉字的四个角笔画的数字编码,组成了一个汉字对应的数字编码。
●音码:音码是依据汉字读音的编码,现在常用的拼音输入法有搜狗输入法、紫光输入法、Google输入法、拼音输入法,这些输入法比早期微软操作系统自带的拼音输入法有很大的便利性,一般都具有词语简拼、联想、记忆、专用词汇等功能,大大方便了人们的输入个性习惯。
●形码:形码是根据汉字的字形进行编码,最典型的有新华字典的部首,五笔字型编码、表形码等。
●音形码:将汉字的拼音和字形合起来进行编码的方式为音形码,主要有二笔码等这种输入方式没有被广泛地使用。
②机内码。汉字内码是在设备和信息处理系统内部存储、处理、传输汉字信息时所使用的汉字代码。由于汉字数量多,用一个字节的信息量无法区别所有的汉字,需要用两个字节来存放汉字的内码,两个字节共有16个二进制位,即216=65536,也就是说两个字节的内码可区别65536个不同的汉字,这足以满足实际应用的需要了。
目前汉字的内码一般是将国标GB 2312—1980交换码中两个字节的最高位分别置为1而得到,以便和英文的ASCII码进行区别。所以汉字的机内码=国标码+(8080)H,如汉字“啊”的内码为(B0A1)。
③输出码。为解决汉字的输出问题,人们研制了汉字字模库(简称字库)。字模是汉字字库中存放的汉字字形,在计算机中常用两种方法:用点阵字形和轮廓字形来描述汉字的字形。汉字的字形码就是用于显示和打印汉字字形信息的编码。
汉字的字库包含了每一个汉字的字形码。用输入码将汉字输入计算机,计算机再通过软件从中取出汉字的字形码,然后显示或打印出来。
●点阵字形。每个字形都以一组排成方阵的二进制数字来表示一个汉字,有笔画覆盖的地方用1表示,没有的用0表示。16×16点阵字形就是用16行16列的256个点表示汉字的字形,如汉字“三”就可用图1-25(a)的点阵图形来表示,而汉字“梅”的216×222的点阵图形如图1-25(b)所示。

图1-25 汉字点阵图形
目前,我国已制订了国标一级和二级汉字的16×16、24×24、32×32、48×48、64×64和128×128的点阵字形标准,可输出几十种字体的大小汉字。常用的几种汉字点阵类型的参数见表1-5。
点阵的点数越多,输出的汉字就越精确美观,但所占用的存储空间就越大。常见的点阵字体有bdf、pcf、fnt、hbf等格式。
表1-5 汉字的点阵类型

【例10】计算一个汉字用48×48点阵显示所使用的存储空间。
由于一个汉字使用了方阵来表示,这个方阵用了48×48位二进制,所以共占用48×48÷8=288个字节来表示。
要实现近8000个常用汉字和符号的显示和打印,字库要占很大的存储空间。如48×48点阵的汉字库就需要约2.2MB的存储空间。
点阵字库最大的缺点是占用较大的存储空间,且点阵字体很难进行放大,一旦放大后就会发现文字边缘的锯齿。特定的点阵字体只能清晰地显示在相应的字号下。
●轮廓字形。轮廓字形的表示方法就是把汉字或符号的笔画轮廓用一组直线段或曲线段描述。其优点是占用存储空间小,字形质量高,当它无级放大或缩小及其他字形变化时,其笔画轮廓仍然能保持圆滑。如Windows中的TrueType字库采用的就是典型的轮廓字形表示方法。
Windows使用的字库也为以上两类,在FONTS目录下,如果字体扩展名为FON,表示该文件为点阵字库,扩展名为TTF则表示轮廓字库。点阵字库文件的图标为一个红色的“A”,轮廓字库图标是两个“T”或“O”。