
任务二 计算机中的数制和信息编码
1.数制的概念
数制(Number System)是人们用一组统一规定的符号和规则来表示数的方法。人们通常使用的是进位计数制,即按进位的规则进行计数。下面是与进位计数制相关的几个概念。
(1)基数。基数指某种数制中所需要使用的计数符号的总个数。如十进制的基数为10,二进制的基数为2。
(2)位权。数制中一个计数符号处在不同位置所代表的值是不同的,它的实际数值是计数符号乘以某一个固定的常数,这个常数就叫作“位权”。位权与基数的关系是:各数制中位权的值是基数的若干次幂,每一位的计数符号与该位“位权”的乘积表示该位数值的大小。如十进制数111,从右往左,第一个1的位权是100,值为1;第二个1的位权是101,值为10;第三个1的位权是102,值为100。
(3)进位。各数制中计数达到了基数值时即向高一位进1。如十进制逢十进一,二进制逢二进一。任意N进制,则逢N进一。
(4)数制的位权表示法。任意一种进位计数制表示的数,都可以写成按其位权展开的多项式之和。任意一个R进制数N可表示为

式中,R是基数;Di为该数的计数符号,可以是0,1,…,R-1;Ri为位权;m、n均为正整数,n为整数位数,m为小数位数。
2.计算机常用数制及其标识
(1)几种常用的数制
日常生活中最常使用的是十进制,而在计算机的内部,任何类型的数据最终都要转变成为二进制的形式来存储和处理。在计算机科学中除了十进制,经常使用的数制还有二进制、八进制和十六进制。
① 十进制。十进制有0、1、2、3、4、5、6、7、8、9共10个计数符号,基数是10,位权是10的幂次方,计数时按“逢十进一”的原则进位。例如(3333.33)10=3×103+3×102+3×101+3×100+3×10-1+3×10-2。
② 二进制。二进制只有0和1两个计数符号,基数是2,位权是2的幂次方,计数时按“逢二进一”的原则进位。例如(1010.11)2=1×23+0×22+1×21+0×20+1×2-1+1×2-2。
③ 十六进制。十六进制有0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F共16个计数符号,基数是16,位权是16的幂次方,计数时按“逢十六进一”的原则进位。例如(3333.AF)16=3×163+3×162+3×161+3×160+10×16-1+15×16-2。
④ 八进制。八进制有0、1、2、3、4、5、6、7共8个计数符号,基数是8,位权是8的幂次方,计数时按“逢八进一”的原则进位。例如(3333.33)8=3×83+3×82+3×81+3×80+3×8-1+3×8-2。
(2)数制的标识
在计算机的数制中,为了区分不同数制的数,常采用以下两种方法进行标识。
① 对数加上括号和下标。如(1011)2、(1067)8、(1089)10、(10AF)16分别表示二进制数、八进制数、十进制数和十六进制数。
② 对数加上英文字母后缀。二进制(Binary)加上字母后缀B,八进制(Octonary)加上字母后缀O,十进制(Decimal)加上字母后缀D,十六进制(Hexadecimal)加上字母后缀H。如1011B、1067O、1089D、10AFH分别表示二进制数、八进制数、十进制数和十六进制数。
常用的4种进位计数制表示数的方法及其相互之间的对应关系见表1-1。
表1-1 4种常用数制对照表

3.不同数制间的转换
(1)十进制数转换为非十进制数
① 十进制整数转换成二进制整数。十进制整数转换成二进制整数,一般采用“除2取余”法。所谓“除2取余”法,就是将十进制数反复除以2,每次相除后,若余数为1,则对应二进制数的相应位为1;若余数为0,则相应位为0。首次除法得到的余数是二进制数的最低位,最末一次除法得到的余数是二进制数的最高位。从低位到高位逐次进行,直到商是0为止。若第一次除法所得到的余数为K0,最后一次为Kn-1,则Kn-1Kn-2…K1K0为所求之二进制数。
【例1.1】将(137)10转换成二进制数。
答:将(137)10转换成二进制数的转换过程可表示如下。

由此可知,(137)10=(10001001)2。
② 十进制整数转换成八进制整数、十六进制整数。同样道理,十进制整数转换成八进制整数、十六进制整数可分别采用“除8取余”法、“除16取余”法。
注意
第一次除法取得的余数为转换后整数的最低位,最后一次除法取得的余数应为转换后整数的最高位。
③ 十进制纯小数转换成二进制纯小数。十进制纯小数转换成二进制纯小数采用“乘2取整”法。所谓“乘2取整”法,就是将十进制纯小数反复乘以2,每次乘2之后,所得整数部分若为1,则二进制纯小数的相应位为1;若整数部分为0,则相应位为0。从高位向低位逐次进行,直到满足精度要求或乘2后的小数部分是0为止。第一次乘2所得的整数部分为K-1,最后一次为K-m,转换后,所得的纯二进制小数为0.K-1K-2…K-m。
【例1.2】将(0.125)10转换成二进制数。
答:将(0.125)10转换成二进制数的转换过程可表示如下。

由此可知,(0.125)10=(0.001)2。
需要注意的是,在“乘2取整”过程中,当乘2后能使代表小数的部分等于零时,转换结束;当乘2后小数部分总是不等于零时,转换过程将是无限的。遇到这种情况时,应根据精度要求取近似值。无论转换的结果是有限位的小数,还是非有限位的小数,转换结果所取的小数位数都应根据对该二进制小数的精度要求来确定。
④ 同样道理,可将十进制小数通过“乘8取整”法和“乘16取整”法转换成相应的八进制、十六进制小数。
注意
第一个乘法后取得的整数是转换后二进制、八进制或十六进制小数的最高位;最后一个乘法后取得的整数(相对精度要求)是转换后二进制、八进制或十六进制小数的最低位。
⑤ 十进制混合小数转换成非十进制混合小数。混合小数由整数和小数两部分组成。只要按照上述方法分别对整数部分和小数部分进行转换,然后将转换结果组合起来,即可得到所要求的非十进制混合小数。
【例1.3】将(137.125)10转换为二进制数。
答:参照例1.1和例1.2的结果,可知

(2)非十进制数转换成十进制数
非十进制数转换成十进制数,只要将该数写成按位权展开的多项式之和,计算出结果即得到相应的十进制数。
【例1.4】将(11011.11)2转换为十进制数。
答:(11011.11)2=1×24+1×23+0×22+1×21+1×20+1×2-1+1×2-2=(27.75)10
【例1.5】将(123.11)8转换为十进制数。
答:(123.11)8=1×82+2×81+3×80+1×8-1+1×8-2=64+16+3+0.125+0.015625=(83.140625)10
【例1.6】将(1CF.1)16转换为十进制数。
答:(1CF.1)16=1×162+12×161+15×160+1×16-1=256+192+15+0.0625=(463.0625)10
(3)非十进制数之间的转换
① 二进制数转换成八进制数。由于23=8,所有3位二进制数的值分别是0、1、2、3、4、5、6、7,正好对应八进制数中的1位。因此,二进制数转换成八进制数时,只需以小数点为界,分别向左、向右,每3位二进制数分为一组,不足3位时用0补足3位(整数在高位补零,小数在低位补零)。然后将每组分别用对应的1位八进制数替换,即可完成转换。
【例1.7】将(11010111.0101)2转换为八进制数。
答:由于
可知,(11010111.0101)2= (327.24)8。
② 八进制数转换成二进制数。由于八进制数的任意l位数可对应3位二进制数,因此,只要将每位八进制数用相应的3位二进制数替换,即可完成转换。
【例1.8】把八进制数(752.123)8转换成二进制数。
答:由于
可知,(752.123)8=(111101010.001010011)2。
③ 二进制数与十六进制数之间的转换。由于24=16,每4位二进制数的值分别对应十六进制数中的1位。因此,仿照二进制数与八进制数之间的转换方法,很容易得到二进制数与十六进制数之间的转换方法。即将每4位二进制数为一组,转换为对应的1位十六进制数;或每1位十六进制数转换为相应的一组4位二进制数。
【例1.9】把(111101010.001010011)2转换为十六进制数。
答:由于
可知,(111101010.001010011)2= (1EA.298)16
【例1.10】把(2CA.6F)16转换为二进制数。
答:由于
可知,(2CA.6F)16=(001011001010.01101111)2。
4.计算机中的信息编码
(1)信息编码的概念
在计算机内部的各种信息都必须经过数字编码后才能被存储、处理和传输。
信息编码是指使用规定的一组基本符号,根据一定的原则进行组合,以表示大量复杂多样的信息。信息编码的两个基本要素是基本符号及其组合规则。例如,十进制数使用10个阿拉伯数字来表示,英文词汇使用26个英文字母来表示,二进制编码使用“0”和“1”两个基本符号来表示。计算机中所有的信息最终都是转换成二进制编码来存储和处理的。
计算机采用二进制编码的主要原因如下。
① 二进制编码在物理上容易实现。例如,可以只用高、低两个电平表示“0”和“1”,也可以用脉冲的有无或者脉冲的正负极性来表示“0”和“1”。
② 用二进制编码来表示的十进制数及其编码、计数、加减运算规则比较简单。
③ 二进制编码的两个符号“0”和“1”正好与逻辑命题的“是”和“否”、“真”和“假”对应,为计算机实现逻辑运算和程序中的逻辑判断提供了便利的条件。
(2)常见的信息编码
① ASCII码。ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码)是目前在计算机中最普遍采用的字符信息编码。ASCII码已被国际标准化组织定为国际标准。ASCII码中每个字符使用7位二进制数进行编码,一共可以表示128个字符。其中包括94个可印刷字符(10个数字字符0~9,26个大写英文字母A~Z,26个小写英文字母a~z,32个标点符号)和34个不可印刷的控制符,见表1-2。
表1-2 ASCII码表

在计算机内部一个ASCII字符实际占用一个字节即8位二进制位,其最高位保持为“0”,在数据传输过程中用作校验位。
例如,字母A的ASCII码值为二进制01000001(十进制65,十六进制41,八进制101),字母a的ASCII码值为二进制01100001(十进制97,十六进制61,八进制141),数字3的ASCII码值为二进制00110011(十进制51,十六进制33,八进制063)等。
注意
所有的英文大写字母的ASCII码值比其对应的小写字母的ASCII码值要小32。
② 中文信息编码。计算机在处理中文信息时需要解决的信息编码问题比西文信息编码要复杂得多。中文信息的编码包括汉字输入码、国家标准汉字信息交换码、汉字机内码、汉字字形码等。
• 汉字输入码。汉字输入码简称外码,是计算机操作人员从键盘上输入的代表汉字的编码,由汉语拼音、数字或一些特殊符号构成。常见的有区位码、五笔字型码、智能拼音等。
• 国家标准汉字信息交换码。国家标准汉字信息交换码简称国标码,是1980年中国制定的,用于具有汉字处理功能的计算机系统间交换汉字信息时使用的代码。目前国标码收入6763个汉字,其中一级汉字(最常用)3755个,二级汉字3008个,另外还包括682个西文字符、图符。一级汉字为常用字,按拼音顺序排列,二级汉字为次常用字,按部首排列。国标码的范围是2121H~7E7EH。
区位码:将GB 2312—1980的全部字符集组成一个94×94的方阵,每一行称为一个“区”,编号为01~94;每一列称为一个“位”,编号为01~94,这样得到GB2312—1980的区位图。用汉字所在区位图的位置的行号和列号来表示的汉字编码,称为区位码。区位码是一个4位的十进制数。
国标码:在一个汉字的区码和位码上分别加十六进制数20H,即构成该汉字的国标码。例如,汉字“啊”位于16区01位,其区位码为十进制数1601D,即十六进制数1001H,由于10H+20H=30H、01H+20H=21H,所以其对应的国标码为十六进制数3021H。
为了使中文信息和西文信息相互兼容,需要使用字节的最高位来区分西文或汉字。通常字节的最高位为“0”时表示ASCII码;为“1”时表示汉字。可以用第一字节的最高位为“1”表示汉字,也可以用两个字节的最高位为“1”表示汉字。目前采用较多的是用两个字节的最高位都为“1”时表示汉字。
• 汉字机内码。汉字机内码简称内码,是计算机内部存储、处理加工和传输汉字时所使用的统一机内代码,由两个字节的二进制编码组成。无论哪种汉字系统和汉字输入方法,输入的汉字外码都要转换为机内码,才能被存储和进行各种处理。
在一个汉字的国标码加上十六进制数8080H,就构成该汉字的机内码(内码)。例如,汉字“啊”的国标码为3021H,其机内码为B0A1H(3021H+8080H=B0A1H)。
• 汉字字形码。汉字字形码是为了解决汉字的显示或打印输出而设计的汉字编码。汉字字形码是指汉字的点阵代码。用一组排列成方阵的二进制数字来表示一个汉字,有汉字笔画覆盖的位置用“1”表示,否则用“0”表示。根据汉字输出精度要求的不同,点阵的多少也不同,常用的有16×16、24×24、32×32、48×48等点阵。汉字点阵又称为汉字字模。
汉字点阵的信息量很大,例如:使用16×16点阵表示一个汉字,需要32字节;使用48×48点阵表示一个汉字,需要288个字节;若使用48×48点阵表示国标码中7445个汉字和图形字符,则需要7445×288个字节,约占2MB的存储空间。因此,汉字字形码一般不用于机内存储,只在需要输出汉字时通过检索汉字字库获得,通过输出汉字点阵从而得到汉字字形。
5.计算机中的数据单位
在计算机内所有的数据都是采用二进制的形式进行存储、处理和传输的。计算机中常用的数据单位有位、字节和字等。
(1)位
位(bit)是二进制数中的一个数位,可以是0或1,是计算机中数据的最小单位。
(2)字节
字节(Byte,B)是计算机中数据的基本单位,1字节由8个二进制位组成,即1 B = 8 bit。计算机中一般以字节表示数据长短和存储容量。例如,1个ASCII码使用1字节表示,1个汉字使用2字节表示。比字节更大的数据单位有KB(Kilobyte,千字节)、MB(Megabyte,兆字节)、GB(Gigabyte,吉字节)和TB(Terabyte,太字节)。它们的换算关系如下:
1 KB = 1024 B = 210B;
1 MB = 1024 KB = 210KB = 220B = 1024 × 1024B;
1 GB = 1024 MB = 210MB = 230B = 1024 × 1024 × 1024B;
1 TB = 1024 GB = 210GB = 240B = 1024 × 1024 × 1024 × 1024B。
(3)字
字(Word)是计算机一次存取、运算、加工和传送的数据长度,是计算机处理信息的基本单位,一个字由若干个字节组成,通常将组成一个字的位数称为字长。例如,一个字由4字节组成,则字长为32位。