1.3 计算机中的数制与编码系统
数制也称计数制,是用一组固定的符号和统一的规则表示数值的方法。编码是采用少量的基本符号,按一定的组合原则,用来表示大量信息的技术。计算机是处理文本、图像、音频、视频等信息的工具,任何信息必须转换成二进制形式的数据后,才能被计算机处理、存储和传输。
1.3.1 常用数制
数制的种类很多,有二进制(两根筷子为一双)、六十进制(60分钟为一小时)、十二进制(12个月为一年)、二十四进制(一天为24小时)等,日常生活中最常用的是十进制。计算机内部采用二进制存储数据和进行运算。对于其他数制的数据,计算机先要将其转换成二进制数存入计算机内部后,才能进行运算。对于运算得到的二进制结果,又要将其转换成人们习惯的进制形式通过输出设备输出。下面介绍与计算机有关的几种常用数制(见表1-3)。
表1-3 计算机中常用的数制
1.十进制
特点:有10个不同的数码符号0、1、2、3、4、5、6、7、8、9,基数为十,逢十进一。
例如:
(6 039.15)10=6×103+0×102+3×101+9×100+1×10-1+5×10-2
其中6、0、3、9、1、5为数码,它在数中的位置称为数位,每位数位上所能使用的数码符号数称为基数。每个数位上的数码符号所代表的数值等于该数位上的数码乘以一个固定值,这个固定值的数值称为位权。
2.二进制
特点:有两个不同的数码符号0、1,基数为二,逢二进一。
例如:(1 011.01)2=1×23+0×22+1×21+1×20+0×2-1+1×2-2=(11.25)10
3.八进制
特点:有8个不同的数码符号0、1、2、3、4、5、6、7,基数为八,逢八进一。例如:(407.2)8=4×82+0×81+7×80+2×8-1=(263.25)10
4.十六进制
特点:有16个不同的数码符号0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,基数为十六,逢十六进一。
例如:(A2F)16=10×162+2×161+15×160=(2 607)10
归纳上述几种数制的特点可知,R进制由R个数码符号组成,运算时每相邻两位遵循“逢R进一”原则。任意一个R进制数都可以使用R进制的位权展开形成多项式。
1.3.2 不同数制间的转换
1.二进制数、八进制数、十六进制数转换为十进制数
转换方法:采用相应的位数展开法实现,即将相应的进制数按“位权”展开,然后各项相加,就得到相应的十进制数。
【例1-1】 二进制数转换为十进制数。
(101.101)B=1×22+0×21+1×20+1×2-1+0×2-2+1×2-3=4+0+1+0.5+0+0.125=(5.625)D
【例1-2】 八进制数转换为十进制数。
(75.1)O=7×81+5×80+1×8-1=56+5+0.125=(61.125)D
【例1-3】 十六进制数转换为十进制数。
(A5F.D)H=10×162+5×161+15×160+13×16-1=2 560+80+15+0.8125=(2 655.812 5)D
2.十进制数转换为二进制数、八进制数、十六进制数
对十进制整数部分采用除R(基数)取余的方法。即把要转换的数除以新进制的基数,把余数作为新进制的最低位;把上一次得到的商再除以新进制的基数,把余数作为新进制的次低位;依次进行,直到最后的商为0,这时的余数就是新进制的最高位。
例如,将(25)10转换为二进制数。
因此,(25)10=(11 001)2。
对十进制数小数部分采用乘R(基数)取整法的方法。即把要转换数的小数部分乘以新进制的基数,将得到的整数部分作为新进制小数部分的最高位;用上一步得到的小数部分再乘以新进制的基数,将整数部分作为新进制小数部分的次高位;依次进行,直到小数部分变成0或者达到预定的要求为止。
例如,将(0.625)10转换为二进制数。
因此,(0.625)10=(0.101)2。
对于既有整数部分又有小数部分的十进制数,则整数部分和小数部分分别用不同的方法进行转换,之后合二为一。
说明:把十进制数转换成二进制数时,整数部分均可用有限位的二进制整数表示;但对于小数部分却不一定能用有限位的二进制小数表示。例如,(0.1)D=(0.000 1100 1100 1100 1100…)B。
十进制数与二进制数、八进制数、十六进制数间的对照关系如表1-4所示。
表1-4 十进制数与二进制数、八进制数、十六进制数的对照关系
3.二进制数与八进制数、十六进制数的互相转换
R进制数的一个数的组成符号需用几个二进制位来表示,可通过式子n=log2N计算。其中n为所需二进制位,N为R进制数的基数。八进制数可以用n=log28,即3位二进制数表示;十六进制数可用n=log216,即4位二进制数表示,并有一一对应关系。二进制数与八进制数的对照关系如表1-5所示,二进制数与十六进制数的对照关系如表1-6所示。
表1-5 二进制数与八进制数的对照关系
表1-6 二进制数与十六进制数的对照关系
二进制数转换为八进制数时,以小数点为界,整数部分按照由右至左(由低位向高位)的顺序每3位划分成一组,最高位不足3位的向前(向左)补0;小数部分按照从左至右(由高位向低位)的顺序每3位划分成一组,最低位不足3位的向后(向右)补0;然后分别用3位二进制代码与八进制数码一一对应完成转换。八进制数按照对应关系和书写顺序直接转换成二进制数。
二进制数转换为十六进制数时,也是以小数点为界,整数部分按照由右至左(由低位向高位)的顺序每4位划分成一组,最高位不足4位的向前(向左)补0;小数部分按照从左至右(由高位向低位)的顺序每4位划分成一组,最低位不足4位的向后(向右)补0;然后分别用4位二进制代码与十六进制数码一一对应完成转换。十六进制数按照对应关系和书写顺序直接转换成二进制数。
【例1-4】 将(1010111.01101)2转换成八进制数。
所以(1010111.011.1)2=(127.32)8。
【例1-5】 将(327.5)8转换为二进制数。
所以(327.5)8=(11010111.101)2。
【例1-6】 将(110111101.011101)2转换为十六进制数。
所以(110111101.011101)2=(1BD.74)16。
【例1-7】 将(27.FC)16转换成二进制数。
所以(27.FC)16=(100111.111111)2。
1.3.3 计算机中数的表示法
在计算机中,采用数的符号和数值一起编码的方法表示数据。常用的数的表示法有原码表示法、反码表示法和补码表示法等。为了区分一般书写时表示的数和机器中编码表示的数,称前者为真值,后者为机器数或机器码。
1.正数与负数
数有正负之分,常规情况下在一个数字前加“+”表示正数,在一个数字前加“-”表示负数。但是因为计算机无法识别“+”和“-”这两个符号,所以将数的最高位设置为符号位,规定“0”代表正号,“1”代表负号。例如,(+1011011)2和(-1011011)2在计算机中分别表示为01011011和11011011,这两个数的最高位0和1就是符号位。
2.原码表示法
原码表示法是一种比较直观的表示方法,其符号位表示该数的符号,即符号为正用“0”表示,符号为负用“1”表示;而数值部分仍保留其真值的特征。
若定点整数x的二进制形式为x0x1x2…xn,则原码表示的定义如下。
式中[x]原是机器数,x是真值。
例如:x1=+1101011 [x1]原=01101011
x2=-1101011 [x2]原=11101011
若定点小数的二进制形式为x0x1x2…xn,则原码表示的定义如下。
式中[x]原是机器数,x是真值。
例如:x1=+0.101 1,则[x1]原=0.101 1
x2=-0.101 1,则[x2]原=1.101 1
对于0,原码机器中往往有“+0”、“-0”之分,故有以下两种形式。
[+0]原=0.000…0 [-0]原=1.000…0
原码表示法最大的优点是比较直观、简单易懂,缺点是加法运算复杂。因为当两数相加时,如果是同号,则数值相加,如果是异号,则要进行减法。在进行减法时,还要比较绝对值的大小,然后用大数减去小数,最后为结果选择恰当的符号。显然,利用原码做加减法运算不太方便。为了解决这些矛盾,采用反码表示法和补码表示法。
3.反码表示法
在反码表示法中,正数的反码与正数的原码一样;负数的反码符号位为1,数值部分通过将负数原码的数值部分各位取反得到,即0变1,1变0。
例如:x1=+1101011,则[x1]原=01101011,[x1]反=01101011
x2=-1101011,则[x2]原=11101011,[x2]反=10010100
对于0,在反码情况下有两种表示形式,即[+0]反=0.000…0,[-0]反=1.111…1。
4.补码表示法
采用补码表示法进行减法运算比原码方便得多。因为不论是正数还是负数,机器总是做加法,减法运算可变为加法运算。正数的补码与原码相同,负数的补码就是反码在末位加“1”。
例如:x1=+1101011,则[x]补=01101011
x2=-1101011,则[x]补=10010100+1=10010101
说明:0的补码只有一种表示形式,即[+0]补=[-0]补=0.0000。
1.3.4 常用信息编码
1.BCD码
日常生活中人们习惯使用十进制来计数,但计算机中使用的是二进制数,因此,输入计算机中的十进制数需要转换成二进制数;数据输出时,应将二进制数转换成十进制数。为了方便,大多数通用性较强的计算机需要能直接处理十进制形式的数据。为此,在计算机中还设计了一种中间数字编码形式,它把每一位十进制数用4位二进制编码表示,称为二进制编码的十进制表示形式,简称BCD码(Binary Coded Decimal)。
BCD码有多种编码方式,常用的有8421BCD码。表1-7为十进制数与8421BCD码之间的对应关系。8421BCD码选取4位二进制数的前10个代码分别对应十进制数的10个数码。8421BCD码的主要缺点是实现加减运算的规则比较复杂,在某些情况下,需要对运算结果进行修正。
表1-7 十进制数与8421BCD码之间的对应关系
2.ASCII码
目前国际上使用最广泛的是美国国家信息交换标准代码(American Standard Code for Information Interchange),简称ASCII码。ASCII码有7位码和8位码两种版本。国际通用的7位ASCII码规定用7位二进制数编码一个字符,共可表示27=128个常用字符,其中包括32个通用控制字符、10个十进制数码、52个英文大小写字母和34个专用符号。其中95个编码对应计算机终端能敲入并且可以显示的95个字符,打印机设备也能打印这95个字符,如大小写各26个英文字母、0~9这10个数字符、通用的运算符和标点符号(=、-、*、/、<、>、,、:、·、?、。、(、)、{、}等)。
7位ASCII编码和128个字符的对应关系如表1-8所示。表中编码符号的排列次序为b7b6b5b4b3b2b1b0,其中b7恒为0(表中未给出),b6b5b4为高位部分,b3b2b1b0为低位部分。例如,字母D的7位ASCII码值为1000100B(B表示二进制数)或44H(H表示十六进制数);数字8的7位ASCII码值为0111000B或38H等。
表1-8 7位ASCII码与128个字符的对应关系
8位ASCII码是在7位ASCII码基础上加一个奇偶检验位而构成的。例如,若采用偶校验,则7位ASCII码中1的个数为偶数,第8位补0,否则补1。例如,字母D、数字8的偶校验8位ASCII码值分别为01000100B、10111000B。
3.汉字编码
ASCII码只对英文字母、数字和标点符号进行编码。为了使计算机能处理汉字,同样也需要对汉字进行编码。常用的汉字编码是汉字输入码。为了适应中文信息处理的需要,1981年国家标准局公布了GB 2312—80《信息交换用汉字编码字符集——基本集》,收集了67 763个常用汉字,并给这些汉字分配了代码。
计算机对汉字信息进行处理时,必须先将汉字代码化,即转换成汉字输入码。汉字输入码送入计算机后还必须转换成汉字内部码,才能进行信息处理。处理完毕之后,再将汉字内部码转换成汉字字形码,才能在显示器或打印机输出。因此汉字的编码有输入码、内码、字形码3种。
(1)汉字输入码。为将汉字输入计算机中而编制的代码称为汉字输入码,也叫外码。目前,计算机一般使用西文标准键盘输入,为了能直接使用西文标准键盘输入汉字,必须给汉字设计相应的输入编码方法。其编码方案主要分为3类:数字编码、拼音码和字形编码。
①数字编码。常用的是国标区位码,用数字串输入一个汉字。区位码是将国家标准局公布的6 763个两级汉字分为94个区,每个区分94位,实际上把汉字集排列成二维数组的形式,行为区,列为位,每个汉字在数组中的下标就是区位码。区码和位码各用两位十进制数字表示,因此输入一个汉字需按键4次。例如,“中”字位于第54区48位,区位码为5448。数字编码输入的优点是无重码(一个数字编码对应几个汉字即为重码),输入码与内部编码的转换比较方便;缺点是代码难以记忆。
②拼音码。拼音码是以汉语拼音为基础的输入方法。凡是掌握汉语拼音的人,都不需训练和记忆,即可使用;但汉字同音字太多,输入重码率很高,因此按拼音输入后还需要选择同音字,影响了输入速度。
③字形编码。字形编码是用汉字的形状进行的编码。汉字总数虽多,但是由一笔一画组成的,全部汉字的部件和笔画是有限的。因此,把汉字的笔画、部件用字母或数字进行编码,按笔画的顺序依次输入,就能表示一个汉字了。其中五笔字型编码是最有影响的一种字形编码方法。
(2)汉字内码。同一个汉字以不同输入方式进入计算机时,编码长度及0、1组合顺序差别很大,这使汉字信息的进一步存取、使用、交流十分不方便,必须转换成长度一致且与汉字唯一对应的能在各种计算机系统内通用的编码,满足这种规则的编码叫汉字内码。汉字内码是用于汉字信息的存储、交换、检索等操作的机内代码,一般采用2字节表示。英文字符的机内代码是7位的ASCII码,当用一字节表示时,最高位为0。为了能够与英文字符区别,汉字机内代码中2字节的最高位均规定为1。
(3)汉字字形码。存储在计算机内的汉字需要在屏幕上显示或在打印机上输出时,需要知道汉字的字形信息,汉字内码并不能直接反映汉字的字形,而要采用专门的字形码。目前的汉字处理系统中,字形信息的表示大体有两种形式:一类是用活字或文字版的母体字形形式;另一类是点阵表示法、矢量表示法等形式。其中最基本的,也是大多数字形库采用的是以点阵形式存储汉字字形编码的方法。
点阵字形是将字符的字形分解成若干“点”组成的点阵,将此点阵置于网状上,每一小方格是点阵中的一个“点”,点阵中的每一个点可以有黑白两种颜色,有字形笔画的点用黑色,反之用白色,这样就能描写出汉字字形。图1-31是汉字“你”的点阵,如果用十进制的1表示黑色点,用0表示没有笔画的白色点,对于16×16点阵的汉字,每一行16个点用2字节表示,则需32字节描述一个汉字的字形,即一个字形码占32字节。
图1-31 汉字“你”的点阵
根据汉字输出的要求不同,点阵的多少也不同。简易型汉字为16×16点阵;提高型汉字为24×24点阵、32×32点阵,甚至更高。点阵越大,描述的字形越细致美观,质量越高,所占存储空间也越大。
已知汉字点阵的大小,可以计算出存储一个汉字所需的字节空间。例如,用16×16点阵表示一个汉字,就是将每个汉字用16行,每行16个点表示。一个点需要1位二进制代码,16个点需用16位二进制代码(即2字节),共16行,所以需要16×(16/8)=32字节,即16×16点阵表示一个汉字时字形码需占用32字节,即字节数=点阵行数×(点阵列数/8)。
通常,计算机中所有汉字的字形码集合起来组成汉字库(或称为字模库)存放在计算机的ROM中,当汉字输出时,由专门的字形检索程序,根据这个汉字的内码从汉字库里检索出对应的字形码,由字形码再控制输出设备输出汉字。汉字点阵字形的汉字库结构简单,但是当需要对汉字进行放大、缩小、平移、倾斜、旋转、投影等变换时,汉字的字形效果不好。若使用矢量汉字库、曲线字库的汉字,其字形用直线或曲线表示,能产生高质量的输出字形。用于打印的字库称为打印字库,其中的汉字比显示字库多,而且工作时也不像显示字库需调入内存。全部汉字字形码的集合称为汉字字库。汉字字库可分为软字库和硬字库。软字库以文件的形式存放在硬盘上,使用时要将其调入内存;硬字库则将字库固化在一个单独的存储芯片ROM中,插接在计算机上即可使用。
综上所述,可以这样理解,在计算机内为表示汉字而使用统一的编码方式形成的汉字编码叫内码,内码是唯一的。为方便汉字输入而形成的汉字编码为输入码,属于汉字的外码,输入码因编码方式不同而不同,是多种多样的。为显示和打印输出汉字而形成的汉字编码为字形码,计算机通过汉字内码在字模库中找出汉字的字形码,实现其转换。汉字从送入计算机到输出显示,汉字信息编码形式不尽相同。汉字的输入编码、汉字内码、字形码是计算机中用于输入、内部处理、输出3种不同用途的编码,不要混为一谈。