1.2 数制与编码
1.2.1 数据的存储
在计算机内部,一切数据都是用二进制数的编码来表示的。为了衡量计算机中数据的量,人们规定了一些表示数据的基本单位:位、字节和字。
位是计算机中存储数据的最小单位,指二进制数中的一个位数,其值为“0”或“1”,即一个最小的基本单元电路;其英文名为“bit”,又称为“比特”。
字节是计算机存储容量的基本单位,计算机存储容量的大小是用字节的多少来衡量的。其英文名为“Byte”,通常用“B”表示。字节经常使用的单位还有 KB(千字节)、MB(兆字节)和GB(千兆字节)等,它们与字节的关系是:
1 B = 8 bit
1 KB =210B=1024 B
1 MB =210×1 KB=210×210B=1024×1024 B=1024 KB
1 GB =210×1 MB=210×210×1 KB=210×210×210B=1024×1024×1024 B = 1024 MB
1 TB =210×1 GB=210×210×1 MB=210×210×210×1 KB=210×210×210×210B=1024×1024×1024×1024 B= 1024 GB
通常,一个ASCII码用1个字节表示,一个汉字的国标码用2个字节表示,整数型用2个字节表示,单精度实型数用4个字节表示,双精度实型数用8个字节表示等。
字是计算机内部作为一个整体参与运算、处理和传送的一串二进制数,其英文名为“字”(Word)。字是计算机内CPU进行数据处理的基本单位。
字长是计算机CPU一次处理数据的实际位数,是衡量计算机性能的一个重要指标。字长越长,计算机一次可处理的数据二进制位越多,运算能力就越强,计算精度也越高。目前,计算机字长有8位、16位、32位和64位,通常我们所说的N位的计算机是指该计算机的字长有N位二进制数。例如,486微机内部总线的字长是32位,被称为32位机,则486计算机一次最多可以处理32位数据。
1.2.2 常用数制
1.数制定义
用一组固定的数字和一套统一的规则来表示数目的方法称为数制。数制有进位计数制与非进位计数制之分,目前一般使用进位计数制。
进位计数制采取“逢N进一”原则,并采用进制三要素来表示,即基数、位权和数值。N 是指进位计数制表示一位数所需要的符号数目,称为基数。处在不同位置上的数字所代表的值是确定的,这个固定位上的值称为位权,简称“权”。各进位制中位权的值恰巧是基数的若干次幂。因此,任何一种数制表示的数都可以写成按权展开的多项式之和。
设一个基数为r的数值N,N = (dn−1dn−2…d1d0d−1…d−m),则N的展开为
例如,十进制数2345.67的展开式为
计算机中常使用二进制、十进制、八进制、十六进制等。
2.十进制
十进制数的数码为 0、1、2、3、4、5、6、7、8、9 共十个,进位规则为逢十进一,借一当十。若设任意一个十进制数D,有n位整数、m位小数:Dn−1 Dn−2…D1 D0 D−1…D−m,权是以10为底的幂,则该十进制数的展开式为
3.二进制数
二进制数的数码为0、1,共两个,进位规则为逢二进一,借一当二。若设任意一个二进制数B,有n位整数、m位小数:Bn−1 Bn−2…B1 B0 B−1…B−m,权是以2为底的幂,则该二进制数的展开式为
4.八进制数
八进制数的数码为0、1、2、3、4、5、6、7共8个,进位规则为逢八进一,借一当八。若设任意一个八进制数Q,有n位整数、m位小数:Qn−1 Qn−2…Q1 Q0 Q−1…Q−m,权是以8为底的幂,则该八进制数的展开式为
5.十六进制数
十六进制数的数码为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F共16个,其中数码 A、B、C、D、E、F 分别代表十进制数中的 10、11、12、13、14、15,进位规则为逢十六进一,借一当十六。若设任意一个十六进制数H,有n位整数、m位小数:Hn−1Hn−2…H1 H0 H−1…H−m,权是以16为底的幂,则该十六进制数的展开式为
1.2.3 数制进制与转换
1.十进制数、二进制数、八进制数和十六进制数的对应关系
十进制数、二进制数、八进制数和十六进制数的对应关系如表1.1所示。
表1.1 各种进制数码对照表
2.二进制、八进制、十六进制数换算成十进制数
二进制、八进制、十六进制数换算成二进制数的方法最为简单,即将二进制、八进制或十六进制数按权展开相加即可以得到相应的十进制数。
例如,将二进制数(1011.011)2、八进制(264.48)8和十六进制数(212.A)16转算成十进制数的方法分别为:
(1011.011)2=1×23+0×22+1×21+1×20+0×2−1+1×2−2+1×2−3=(11.875)10
(264.48)8=2×82+6×81+4×80+4×8−1+4×8−2=(183.5625)10
(212.A)16=2×162+1×161+2×160+10×16−1=(530.625)10
3.十进制数换算成二进制、八进制、十六进制数
由于将十进制数换算成二进制、八进制或十六进制数的方法基本相同,所以将其一并介绍,且有易于记忆。为方便叙述,下面将二进制、八进制、十六进制统称为n进制。
十进制数转换算成n进制数,因其整数部分和小数部分的换算方法不相同,所以相应地分整数部分的换算和小数部分的换算。
(1)整数部分的换算
将已知的十进制数的整数部分反复除以n(n为进制数,取值为2、8、16,分别表示二进制、八进制和十六进制),直到商是0为止,并将每次相除之后所得到的余数按次序记下来,第一次相除所得的余数K0为n进制数的最低位,最后一次相除所得余数Kn−1为n进制数的最高位。排列次序为Kn−1Kn−2…K1K0的数就是换算后得到的n进制数。
(2)小数部分的换算
将已知的十进制数的纯小数(不包括乘后所得整数部分)反复乘以 n,直到乘积的小数部分为0或小数点后的位数达到精度要求为止。第一次乘n所得的整数部分为K−1,最后一次乘n所得的整数部分为K−m,则所得n进制小数部分0.K−1K−2…K−m。
若要将十进制数(268.48)10换算成二进制数、八进制数或十六进制数,则只需要将其整数部分和小数部分分别转换成二进制数、八进制数或十六进制数,最后将其结果组合起来即可。
所以有:
(268.48)10=(100001100.01111)2
(268.48)10=(414.36560)8
(268.48)10=(10C.7AE14)16
4.二进制数与八进制数的相互换算
因为二进制的进位基数是 2,而八进制的进位基数是 8。所以三位二进制数对应一位八进制数。
二进制数换算成八进制数的方法是:以小数点为基准,整数部分从右向左,三位一组,最高位不足三位时,左边添0补足三位;小数部分从左向右,三位一组,最低位不足三位时,右边添0补足三位。然后将每组的三位二进制数用相应的八进制数表示,即得到八进制数。
例如,将二进制数(1101011011.0101)2换算为八进制数的方法为:
001 101 011 011.010 100
1 5 3 3 .2 4
所以,(1101011011.0101)2=(1533.24)8
八进制数换算成二进制数的方法是:将每一位八进制数用三位对应的二进制数表示。
例如,将八进制数(217.36)8换算为二进制数的方法为:
2 1 7 .3 6
010 001 111.011 110
所以,(217.36)8= (100011110.01111)2
5.二进制数与十六进制数的相互换算
因为二进制的基数是 2,而十六进制的基数是 16。所以四位二进制数对应一位十六进制数。
二进制数换算成十六进制数的方法是以小数点为基准,整数部分从右向左,四位一组,最高位不足四位时,左边添0补足四位;小数部分从左向右,四位一组,最低位不足四位时,右边添0补足四位;然后将每组的四位二进制数用相应的十六进制数表示,即可以得到十六进制数。
例如,将二进制数(100111111101111011.0111101)2换算成十六进制数的方法为
0010 0111 1111 0111 1011. 0111 1010
2 7 F 7 B. 7 A
所以,(100111111101111011.0111101)2= (27F7B.7A)16
十六进制数换算成二进制数的方法是:将每一位十六进制数用四位相应的二进制数表示。
例如,将十六进制数(3E4F.A9)16转换为二进制数的方法为
3 E 4 F. A 9
0011 1110 0100 1111. 1010 1001
所以,(3E4F.A9)16= (11111001001111.10101001)2
以上讨论可知,二进制与八进制、十六进制的转换比较简单、直观。所以在程序设计中,通常将书写起来很长且容易出错的二进制数用简捷的八进制数或十六进制数表示。
1.2.4 信息编码
数据编码就是规定用什么样的二进制码来表示字母、数字及专用符号。计算机系统中,有两种字符编码方式:ASCII码和EBCDIC码。ASCII码使用最为普遍,主要用在微型机与小型机中,而EBCDIC代码(Extended Binary Coded Decimal Interchange Code,扩展的二—十进制交换码)主要用在IBM的大型机中。
1.ASCII码
目前,国际上使用的字母、数字和符号的信息编码系统是采用美国标准信息交换码(American Standard Code for Information Interchange),简称为ASCII码。它有7位码版本和8位码版本两种。
国际上通用的ASCII码是7位码(即用七位二进制数表示一个字符)。总共有128个字符(27= 128),其中包括:26个大写英文字母,26个小写英文字母,0~9共10个数字,34个通用控制字符和32个专用字符(标点符号和运算符)。具体编码如表1.2所示。
表1.2 7位ASCII码表
要确定某个数字、字母、符号或控制符的ASCII码,可以在上表中先查到它的位置,然后确定它所在位置的相应行和列,再根据行确定低4位编码(b4b3b2b1),根据列确定高3位编码(b7b6b5),最后将高3位编码与低4位编码合在一起(b7b6b5b4b3b2b1)就是要查字符的ASCII码。例如,查表得到字母R的ASCII码为1010010。
同样,也可以由ASCII码通过查表得到某个字符。例如,有一字符的ASCII码是1100001,则查表可知,它是小写字母a。
需要特别注意的是,十进制数字字符的 ASCII 码与它们的二进制数值是不同的。例如,十进制数 5 的七位二进制数是(0000101),而十进制数字字符“5”的 ASCII 码为(0110101)2=(35)16= (53)10。由此可见,数值5与数字字符“5”在计算机中的表示是不同的。数值5可以表示数的大小,并参与数值运算;而数字字符“5”只是一个符号,不能参与数值运算。
2.BCD码
二进制具有很多优点,所以计算机内部采用二进制数进行运算。但二进制读起来不直观,人们希望用十进制数进行输入,在计算机内部用二进制运算,输出时再将二进制数转换成十进制数。通常将十进制数的每一位写成二进制数,这种采用若干位二进制数码表示一位十进制数的编码方案,称为二进制编码的十进制数,简称为二—十进制编码,即 BCD 码。BCD码的编码方案很多,其中8421码是最常用的一种。
3.汉字编码
汉字处理系统对每种汉字输入方法规定了输入计算机的代码,即汉字外部码(又称输入码),由键盘输入汉字时输入的是汉字的外部码。计算机识别汉字时,要把汉字的外部码转换成汉字的内部码(汉字的机内码)以便进行处理和存储。为了将汉字以点阵的形式输出,计算机还要将汉字的机内码转换成汉字的字形码,确定汉字的点阵,并且在计算机和其他系统或设备需要信息、数据交换时还必须采用交换码。
(1)汉字外部码
汉字外部码又称输入码,由键盘输入汉字时主要是输入汉字的外码,每个汉字对应一个外部码。汉字输入方法不同,同一汉字的外码可能不同,用户可以根据自己的需要选择不同的输入方法。目前,使用最为普遍的汉字输入方法是拼音码、五笔字型码和自然码。
(2)汉字交换码(国标码)
汉字信息在传递、交换中必须规定统一的编码才不会造成混乱。目前国内计算机普遍采用的标准汉字交换码是1980年我国根据有关国际标准规定的《信息交换用汉字编码字符集——基本集》,即GB2312—1980,简称国标码。
国标码基本集中收录了汉字和图像符号共7 445个,分为两级汉字。其中一级汉字3755个,属于常用汉字,按照汉字拼音字母顺序排序;二级汉字3 008个,属于非常用汉字,按照部首顺序排序;还收录了682个图形符号。
国标码采用两个字节表示一个汉字,每个字节只使用了低七位,汉字与英文完全兼容。但当英文字符与汉字字符混合存储时,容易发生冲突,所以人们把国标码的两个字节高位置1,作为汉字的内码使用。
(3)汉字机内码
机内码是计算机内部存储和加工汉字时所用的代码。计算机处理汉字,实际上是处理汉字机内码。不管用何种汉字输入码将汉字输入计算机,为了存储和处理方便,都需要将各种输入码转换成长度一致的汉字内部码。一般用二个字节表示一个汉字的内码。
(4)汉字字形码
汉字字形码是一种汉字的输出码,其作用为汉字输出。但汉字机内码不能直接作为每个汉字输出的字形信息,还需根据汉字内码在字形库中检索出相应汉字的字形信息后才能由输出设备输出。对汉字字形经过数字化处理后的一串二进制数称为汉字输出码。
汉字的字形称为字模,以一点阵表示。点阵中的点对应存储器中的一位,16×16 点阵的汉字,有256个点,即256位。由于计算机中,8个二进制位作为一个字节,所以16×16点阵汉字需要2×16 = 32字节表示一个汉字的点阵数字信息(字模)。同样,24×24点阵汉字需要3×24 = 72个字节来表示一个汉字;32×32 点阵汉字需要4×32 = 128个字节表示。点阵数越大,分辨率越高,字形越美观,但占用的存储空间越多。
汉字字库:汉字字形数字化后,以二进制文件形式存储在存储器中,构成汉字字模库。汉字字模库也称汉字字形库,简称汉字字库。