大学计算机应用基础教程(第三版)
上QQ阅读APP看书,第一时间看更新

1.2 数制基础与信息表示

现代计算机是一个数字系统,它的物理基础是数字电路。本节将着重讨论计算机中数的表示方法及其相关的基本知识,包括计算机所使用的数制和编码、定点数和浮点数等,它们是计算机实现“计算”的基础。

1.2.1 数制

1.数制的概念

数制,又称进位计数制,是指用统一的符号规则来表示数值的方法,它有3个基本术语:

①数符:用不同的数字符号来表示一种数制的数值,这些数字符号称为“数符”。

②基数:数制所允许使用的数符个数称为“基数”。

③权值:某数制中每一位所对应的单位值称为“权值”,或称“位权值”,简称“权”。

在进位计数制中,使用数符的组合形成多位数,按基数来进位、借位,用权值来计数。一个多位数可以表示为

式中,i为某一位的位序号;Ai为i位上的一个数符,0≤Ai≤R-1,如十进制有0、1、2、…、8、9共10个数符;R为基数,将基数为R的数称为R进制数,如十进制的R为10;m为小数部分最低位序号;n为整数部分最高位序号(整数部分的实际位序号是从0开始,因此整数部分为n+1位)。

式(1-1)将一个数表示为多项式,也称为数的多项式表示。例如,十进制数786,可以根据式(1-1)表示为786=7×102+8×101+6×100,等式的左边为顺序计数,右边则为按式(1-1)展开的多项式表示。实际上把任何进制的数按式(1-1)展开求和就得到了它对应的R进制数,所以式(1-1)也是不同进制数之间相互转换的基础。

由此,可以将进位计数制的基本特点归纳为:

①一个R进制的数有R个数符。

②最小的数符为0,最大的数符为R-1。

③计数规则为“逢R进1,借1当R”。

2.常用数制

在日常生活中,人们通常使用十进制数,但实际上存在着多种进位计数制,如二进制(2只手为1双手)、十二进制(12个信封为1打信封)、十六进制(成语“半斤八两”,中国古代计重体制,1斤=16两)、二十四进制(1天有24小时)、六十进制(60秒为1分钟,60分钟为1小时)等。在计算机内部,一切信息的存储、处理与传输均采用二进制的形式,但由于二进制数的阅读和书写很不方便,因此在阅读和书写时又通常采用八进制数和十六进制数来表示。表1-2列出了常用的进位计数制。

表1-2 常用进位计数制

(1)十进制

十进制(Decimal System)有0~9共10个数符,基数为10,权系数为10i(i为整数),计数规则为“逢10进1,借1当10”。对十进制的特点我们非常熟悉,因此不再详细介绍。

(2)二进制

二进制(Binary System)是计算机内部采用的数制。二进制有两个数符0和1,基数为2,权系数为2i(i为整数),计数规则为“逢2进1,借1当2”。一个二进制数可以使用式(1-1)展开,例如:

(10101101)2=1×27+0×26+1×25+0×24+1×23+1×22+0×21+1×20

(3)八进制

八进制(Octal System)有8个数符,分别用0、1、2、3、4、5、6、7共8个数符表示,基数为8,权系数为8i(i为整数),计数规则是“逢8进1,借1当8”。由于8=23,因此1位八进制数对应于3位二进制数。一个八进制数可以使用式(1-1)展开,例如:

(753.64)8=7×82+5×81+3×80+6×8-1+4×8-2

(4)十六进制

十六进制(Hexadecimal System)有16个数符,分别用0、1、…、9、A、B、C、D、E、F表示,其中A、B、C、D、E、F分别对应十进制的10、11、12、13、14、15。十六进制的基数为16,权系数为16i(i为整数),计数规则是“逢16进1,借1当16”。由于16=24,因此1位十六进制数对应于4位二进制数。一个十六进制数可以使用式(1-1)展开,例如:

(3EC.B9)16=3×162+14×161+12×160+11×16-1+9×16-2

注意:为了区分不同进制的数,在数字(外加括号)的右下角加脚注10、2、8、16分别表示十进制、二进制、八进制和十六进制,或将D、B、O、H这4个字母放在数的末尾以区分上述4种进制。例如,256D或256表示十进制数,1001B表示二进制数,427O表示八进制数,4B7FH表示十六进制数。

3.计算机采用二进制的原因

人们日常使用的是十进制,但是由于技术上的原因,计算机内部一律采用二进制表示数据和信息,选择二进制的主要原因如下:

(1)二进制容易被物理器件所实现

例如,开关的两个状态(ON/OFF)可以用来表示二进制两个数符0和1,一个二极管的截止和导通也能够与二进制状态对应。

(2)二进制数可靠性高

两种状态表示二进制两个数符,数字传输和处理不容易出错,电路工作可靠,抗干扰能力强。

(3)二进制运算规则简单

例如,二进制的加法法则只有3个,乘法法则也只有3个,简化了计算机内部器件的电路,提高了机器运算的速度。

(4)二进制逻辑性强

计算机工作原理是建立在逻辑运算基础上的,逻辑代数是逻辑运算的理论依据。二进制只有两个数符0和1,正好代表逻辑代数中的“真”和“假”。

4.二进制的运算规则

二进制运算有算术运算、逻辑运算和移位运算等,这里主要介绍加法、乘法和逻辑运算。

(1)加法运算规则

0+0=0,0+1=1,1+1=10

注意:1+1=10,等号右边10中的1是进位。

(2)乘法运算规则

0×0=0,0×1=0,1×1=1

【例1-1】计算10110101+10011010的值。

【例1-2】计算1101×110的值。

(3)逻辑运算规则

二进制数1和0在逻辑上可以代表“真”与“假”、“是”与“否”、“有”与“无”。这种具有逻辑属性的变量称为逻辑变量。计算机的逻辑运算和算术运算的主要区别是:逻辑运算是按位进行的,位与位之间不像加减运算那样有进位或借位的联系。逻辑运算主要包括3种基本运算:逻辑加法(又称“或”运算)、逻辑乘法(又称“与”运算)和逻辑否定(又称“非”运算)。此外,“异或”运算也很有用。

①逻辑加法(“或”运算)。逻辑加法通常用符号“+”或“∨”来表示。逻辑加法运算规则如下:

0+0=0,0∨0=0  0+1=1,0∨1=1  1+0=1,1∨0=1  1+1=1,1∨1=1

可以看出,逻辑加法有“或”的意义。也就是说,在给定的逻辑变量中,A或B只要有一个为1,其逻辑加的结果为1;两者都为1则逻辑加的结果为1。

②逻辑乘法(“与”运算)。逻辑乘法通常用符号“×”或“∧”或“·”来表示。逻辑乘法运算规则如下:

0×0=0,0∧0=0,0·0=0  0×1=0,0∧1=0,0·1=0

1×0=0,1∧0=0,1·0=0  1×1=1,1∧1=1,1·1=1

不难看出,逻辑乘法有“与”的意义。它表示只当参与运算的逻辑变量都同时取值为1时,其逻辑乘积才等于1。

③逻辑否定(非运算)。逻辑非运算又称逻辑否运算。其运算规则为:

=1即非0等于1,1= 即非1等于0

④异或逻辑运算(半加运算)。异或运算通常用符号“⊕”表示,其运算规则为:

0⊕0=0  0同0异或,结果为0  0⊕1=1  0同1异或,结果为1

1⊕0=1  1同0异或,结果为1  1⊕1=0  1同1异或,结果为0

即两个逻辑变量相异,输出才为1。

1.2.2 各种数制的转换

由于计算机内部使用二进制,要让计算机处理十进制数,必须先将其转化为二进制数才能被计算机所接受,而计算机处理的结果又需还原为人们所习惯的十进制数。

1.二进制数转换为十进制数

二进制数转换为十进制数的方法就是将二进制数的每一位数按权系数展开,然后相加。即将二进制数按式(1-1)展开,然后进行相加,所得结果就是等值的十进制数。

【例1-3】把二进制数1101.01转换为十进制数。

(1101.01)2=1×23+1×22+0×21+1×20+0×2-1+1×2-2

      =8+4+0+1+0+0.25

      =(13.25)10

2.十进制数转换为二进制数

将十进制数转换为二进制数是进制转换间比较复杂的一种,也是与其他进制转换的基础。这里把整数和小数转换分开讨论。

(1)整数的转换

十进制整数转换为二进制整数的方法为除基取余法,即将被转换的十进制数用2连续整除,直至最后的余数为0或1,然后将每次所得到的商按相除过程反向排列,结果就是对应的二进制数。

【例1-4】将十进制数173转换为二进制数。

将173用2进行连续整除:

所以,(173)10=(10101101)2

(2)小数的转换

十进制小数转换为二进制小数的方法为乘基取整法,即将十进制数连续乘2得到进位,按先后顺序排列进位就得到转换后的小数。

【例1-5】将十进制小数0.8125转换为相应的二进制数。

余数为0,转换结束。所以,(0.8125)10=(0.1101)2

3.二进制数与八进制数的转换

(1)二进制数转换为八进制数

因为二进制数和八进制数之间的关系正好是2的3次幂,所以二进制数与八进制数之间的转换只要按位展开就可以了。

【例1-6】将二进制数110100101.001011转换为八进制数。

以小数点为界,分别将3位二进制对应1位八进制如下:

所以,(110100101.001011)2=(645.13)8

注意:从小数点开始,往左为整数,最高位不足3位的,可以在前面补零;往右为小数,最低位不足3位的,必须在最低位后面补0。

(2)八进制数转换为二进制数

先将需要转换的八进制数从小数点开始,分别向左和向右按每1位八进制对应3位二进制展开即得到对应的二进制数。

【例1-7】将八进制数357.264转换为二进制数。

(357.264)8=(011101111.010110100)2

转换后的二进制最高位和最低位无效的0可以省略。

4.二进制数和十六进制数之间的转换

(1)二进制数转换为十六进制数

转换方法与前面所介绍的二进制数转换为八进制数类似,唯一的区别是4位二进制对应1位十六进制,而且十六进制除了0~9这10个数符外,还用A~F表示它另外的6个数符。

【例1-8】将二进制数11000111.00101转换为十六进制数。

从小数点开始,往左为整数,最高位不足4位的,可以在前面补零;往右为小数,最低位不足4位的,必须在最低位后面补0。所以,(11000111.00101)2=(0C7.28)16

注意:在给出十六进制数的前面加上“0”是因为这个十六进制数的最高位为字符C,用0作为前缀以示与字母区别。

(2)十六进制数转换为二进制数

先将需要转换的十六进制数从小数点开始,分别向左和向右按每1位十六进制对应4位二进制展开即得到对应的二进制数。

【例1-9】将十六进制数5DF.6A转换为二进制数。

(5DF.6A)16=(010111011111.01101010)2

转换后的二进制最高位和最低位无效的0可以省略。

5.十进制数与八进制数、十六进制数之间的相互转换

表1-3列出了常用进制之间的转换。只要按式(1-1)所给出的表达关系,就可以用数学方法证明并得到相应的转换方法。通常,十进制和八进制及十六进制之间的转换不需要直接进行,可用二进制作为中间量进行相互转换。例如,要将一个十进制数转换为相应的十六进制数,可以先将十进制数转换为二进制数,然后直接根据二进制数写出对应的十六进制数,反之亦然。

表1-3 十进制、二进制、八进制、十六进制转换表

续表

1.2.3 计算机中数值的表示

通过前面的学习已经知道,计算机内部采用二进制表示数据。对于数值型数据,数据有正负和小数之分,因此必须解决有符号数、小数在计算机内部的表示。

1.有符号数与无符号数

由于计算机中只能存储0和1,所以数的符号也必须用0和1来表示。

现在假设一个数据用8位二进制表示,在表示无符号数据时,8位都用于表示数据,因此可表示的数据的范围是0~255(00000000~11111111)。

当表示有符号数时,需要占用一个二进制位来表示符号。约定二进制数的最高位(左边第一位)作为符号位,用“0”表示正数,“1”表示负数,这样,数的正负号就被数值化了。假设一个数据用8位二进制表示,此时可表示的数据的范围是-128~127(10000000~01111111)。例如:

表示数据+52。再如:

表示数据-52。

2.真值与机器数

通常,把数值在计算机中的二进制表示形式称为“机器数”,对于有符号数,因为最高位是符号位,数的形式值就不等于真正的数值,把带符号位的机器数对应的数值称为机器数的“真值”。例如,假设一个数据用8位二进制表示,则对于十进制数+105,由于其对应的二进制数是1101001,因此+105对应的机器数为01101001,而十进制数-105对应的机器数为11101001。

机器数有两个特点:

①机器数的位数固定,能表示的数值范围受到位数限制。例如,字长为8位的计算机,能表示的无符号数的范围是0~255,有符号数的范围是-128~127。由于机器数受字长的限制,因此当计算机运算结果超过机器数所能表示的范围时,就会产生“溢出”。

②用“0”表示正数,“1”表示负数,因此,机器数是连同数据符号一起数字化了的数据。

3.小数

在计算机中小数的表示有两种形式:定点表示法和浮点表示法,其中定点表示法如图1-6所示。

定点表示法是将小数点的位置固定在一个二进制数的某一位置。通常是将其固定在数的最前面,将数据表示为一个纯小数;或固定在数的最后面,将数据表示为一个纯整数。但在存储器件上并不存储小数点,只是隐含规定它就在此位置。

图1-6 定点表示法

例如,将小数点固定在最前面:

表示数据+0.40625。再如,将小数点固定在最后面:

表示数据-52。

上述的定点小数表示法,只能表示纯小数或纯整数,而实际使用的数大部分是混小数,即小数点的前面和后面都有数据,因此用浮点数来表示这样的小数。

由于篇幅所限,本书不再详细介绍浮点表示法,其相关知识可参考其他相关教材。

4.定点数和浮点数

根据小数点位置固定与否,机器数又可以分为定点数和浮点数。通常,使用定点数表示整数,而用浮点数表示实数。

(1)整数

认为整数没有小数部分,小数点固定在数的最右边。整数可以分为无符号整数和有符号整数两类。无符号整数的所有二进制位全部用来表示数值的大小;有符号整数用最高位表示数的正负号,而其他位表示数值的大小。例如,假设数据用8位二进制表示,则十进制整数-65的计算机内部表示形式是11000001。

(2)浮点数

浮点表示法表示的数据,其小数点的位置是浮动的。其思想来源于十进制中的科学计数法。在科学计数法中,任何一个数都可以表示为指数形式,如762.39可以写成0.76239×103,而且可以通过改变指数,使小数点的位置发生移动,如写成76239×10-2。十进制中的科学计数法的一般形式为:N=D×10n,其中D为纯小数,n为整数。在二进制中,一个数也可以写成这种形式:P=S×2E,其中S称为尾数,E称为阶码。

①阶码:用于表示小数点在该数中的位置,它是一个带符号的整数。

②尾数:用于表示数的有效数值,可以采用整数或纯小数两种形式。

一般PC选择32位(单精度)或64位(双精度)二进制表示一个浮点数。32位浮点数格式如下:

例如,一个十进制数-34500,在机器中,它的二进制数为-1000011011000100,如果使用浮点数表示,则为

符号     阶码         尾数

   1     00010000    10000110110001000000000

5.原码、反码和补码

计算机中数的符号被数值化后,为了便于对机器数进行算术运算,提高运算速度,又设计了符号数的各种编码方案,主要有原码、反码和补码3种。

(1)原码

一个正数的原码和它的真值相同,负数的原码为这个数真值的绝对值,符号位为1。假设计算机中用8位二进制位表示一个数据,最高位被设置为符号位,后面的7位表示真值。数X的原码记为[X]。0的原码有两种表示形式:

[+0]=00000000

[-0]=10000000

例如,求十进制数+67和-67的原码。

因为

(67)10=(1000011)2

所以

[+67]=01000011

[-67]=11000011

原码表示的数的范围与二进制数的位数(即机器字长)有关。当用8位二进制数表示时,最高位为符号位,整数原码表示的范围为-128~+127,即最大数是01111111,最小数是11111111。同理,用16位二进制数表示整数原码的范围是-32768~+32767。

原码的优点是简单、直观,用原码进行乘法运算比较方便:尾数相乘,符号位单独运算(不考虑符号位产生的进位,只要将两个参加运算的数做简单的加法就得到它们乘积的符号)。显然,如果用原码进行加法运算就会遇到符号运算需要进行多次判断的麻烦:先要判断符号位是否同号,决定是进行加法或减法;对不同号的情况,还要判断哪个数的尾数大,才能决定最后运算结果的符号。为了简化原码加减法运算的复杂性,计算机中引入了反码和补码。

(2)反码

一个正数的反码等于它的原码;一个负数的反码,最高位(符号位)为1,其余各位按位求反。数X的反码记为[X]

例如,假设用8位二进制位表示一个数据,则+1010010的反码为01010010,-1010010的反码为10101101。

零的反码有两种表示,即

[+0]=00000000

[-0]=11111111

一个数如果不考虑它的符号,按照取“反”的原则求它的反码,并与这个数的原数相加,其结果为所有位都是1。例如,1010010的反码为0101101,将它们相加:

1010010+0101101=1111111

这是反码的一个重要特性,也称作“互补”。通常反码作为求补码过程的中间形式。

(3)补码

一个正数的补码等于它的原码;一个负数的补码,最高位(符号位)为1,其余各位按位求反,最末位加1,即“求反加1”。数X的补码记为[X]

例如,+1010010的补码为01010010;-1010010的反码为10101101,它的补码为反码加1,即10101101+1=10101110。

零的补码表示是唯一的,即

[+0]=00000000

[-0]=00000000

补码表示的数的范围也与二进制数的位数(即机器字长)有关。如果用8位二进制位表示时,最高位为符号位,整数补码表示的范围为-128~+127。用16位二进制数表示整数补码的范围是-32768~+32767。

又如,假设用8位二进制位表示一个数据,求十进制数+67和-67的补码。

因为

(67)10=(1000011)2

所以

[+67]=01000011

[-67]=10111101

6.数据存储单位

(1)位

“位”(bit)是计算机中最小的数据单位。每一位的状态只能是0或1。

(2)字节

8个二进制位构成1个“字节”(Byte,简写为B),它是存储空间的基本计量单位。1B可以存储1个英文字母或者半个汉字,换句话说,1个汉字占据2B的存储空间。

(3)字(Word)

“字”由若干个字节构成,字的位数称作字长,不同档次的计算机有不同的字长。例如,一台8位机,它的1个字就等于1B,字长为8位。如果是一台16位机,那么,它的1个字就由2B构成,字长为16位。字是计算机进行数据处理和运算的单位,是衡量计算机性能的一个重要指标,字长越长,性能越强。

(4)KB(千字节)

在一般的计量单位中,小写k表示1000。例如,1千米=1000米,经常被写为1km;1千克=1000克,写为1kg。同样,大写K在二进制中也有类似的含义,只是这时K表示210=1024,即1KB表示1024B。

(5)MB(兆字节)

计量单位中的M(兆)是106,见到M自然想起要在该数值的后边续上6个0,即扩大100万倍。在二进制中,MB也表示百万级的数量级,但1MB不是等于1000000B,而是1048576B,即1MB=220B=1048576B。

计算机系统在数据存储容量计算中,有如下数据计量单位:

1B=8bit

1KB=210B=1024B

1MB=220B=1048576B

1GB=230B=1073741824B

1TB=240B=1099511627776B

1.2.4 计算机中信息的编码

“数”不仅仅用来表示“量”,它还能作为“码”(Code)来使用。例如,每一个学生入学后都会有一个学号,这就是一种编码,编码的目的之一是为了便于标记每一个学生。又如,在键盘上输入英文字母B,存入计算机的是B的编码01000010,它已不再代表数量值,而是一个字符信息。这里介绍最常用的几种计算机编码。

1.BCD码

人们习惯于使用十进制数,但是在计算机内部都是采用二进制数来表示和处理数据的,因此计算机在输入和输出数据时,都要进行数制之间的转换处理,这项工作如果由人来完成,会浪费大量的时间。因此,必须采用一种编码方法,由计算机自动完成这种识别和转换工作。

所谓BCD(Binary-Coded Decimal)编码,指的是二进制编码形式的十进制数,即把十进制数的每一位分别写成二进制形式的编码。

BCD编码的形式有很多种,通常所采用的是8421编码。这种编码方法是用4位二进制数表示一位十进制数,自左向右每一位所对应的权分别是8、4、2、1。4位二进制数有0000~1111共16种组合形式,但只取前面0000~1001的10种组合形式,分别对应十进制数的0~9,其余6种组合形式在这种编码中没有意义。

BCD编码方法比较简单、自然、容易理解,且书写方便、直观、易于识别,如十进制数2469,其二进制编码为

2    4    6    9

(0010) (0100) (0110) (1001)

2.ASCII码

计算机在不同程序之间、在不同的计算机系统之间需要进行数据交换。数据交换的基本要求就是交换的双方必须使用相同的数据格式,即需要统一的编码。

目前,计算机中使用的最广泛的西文字符集及其编码是ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它最初是美国国家标准学会(ANSI)制定的,后被国际标准化组织(ISO)确定为国际标准,称为ISO 646标准。ASCII码适用于所有拉丁文字字母。ASCII码有两个版本,即标准ASCII码和扩展的ASCII码。

标准ASCII码是7位码(b6~b0),即用7位二进制数来编码,用一个字节存储或表示,其最高位(b7)总是0。7位二进制数总共可编出27=128个码,表示128个字符。标准ASCII码具有如下特点:

①码值000~031(0000000~0011111)对应的字符共32个,通常为控制符,用于计算机通信中的控制或设备的功能控制,有些字符可显示在屏幕上,有些则无法显示在屏幕上,但能看到其效果(如换行字符、响铃字符),如表1-4所示。

表1-4 常用字符与ASCII码对照表(000~031)

续表

②码值为032(0100000)是空格字符,码值为127(1111111)是删除控制符。码值033~126(0100001~1111110)为94个可打印字符,如表1-5所示。

表1-5 常用字符与ASCII码对照表(032~127)

③0~9这10个数字字符的高3位编码为011(30H),低4位编码为0000~1001,低4位的码值正好是数字字符的数值,即数字的ASCII码正好是48(30H)加数字,掌握这一特点可以方便地实现ASCII码与二进制数的转换。

④英文字母的编码是正常的字母排序关系,大、小写英文字母的编码仅仅是b5一位不同,大写字母的ASCII码的b5位为“0”,小写字母的ASCII码的b5位为“1”,即大、小写英文字母的ASCII码值相差32(b5位的权值为25=32)。掌握这一特点可以方便地实现大小写英文字母的转换。

扩展的ASCII码是8位码(b7~b0),即用8位二进制数来编码,用一个字节存储表示。8位二进制数总共可编出28=256个码,它的前128个码与标准的ASCII码相同,后128个码表示一些花纹图案符号。

3.汉字编码

汉字信息在计算机内部处理时要被转化为二进制代码,这就需要对汉字进行编码。相对于ASCII码,汉字编码有许多困难,如汉字量大,字形复杂,存在大量一音多字和一字多音的现象。

汉字编码技术首先要解决的是汉字输入、输出以及在计算机内部的编码问题,不同的处理过程使用不同的处理技术,有不同的编码形式。汉字编码处理过程如图1-7所示。

图1-7 汉字编码处理过程

(1)输入码

汉字输入码又称“外码”,是为了将汉字通过键盘输入计算机而设计的代码,其表现形式多为字母、数字和符号。输入码与输入法有关。不同的输入法得到输入码的方法不同。代表性的输入法有拼音输入法、五笔字型输入法、自然码输入法等。

(2)交换码

汉字交换码是汉字信息处理系统之间或通信系统之间传输信息时,对每一个汉字所规定的统一编码。汉字交换码的国家标准是GB 2312—1980,又称“国标码”。“国标码”收录包括简化汉字6763个和非汉字图形字符682个(包括中外文字母、数字和符合),该编码表分为94行、94列。每一行称为一个“区”,每一列称为一个“位”。这样,就组成了94个区(01~94),每个区内有94个位(01~94)的汉字字符集。每个汉字由它的区码和位码组合形成“区位码”,作为唯一确定一个汉字或汉字符号的代码。例如,汉字“东”的区位码为2211(即在18区的第3位)。

“区位码”划分为4组,具体如下:

①1~15区为图形符号区,其中,1~9区为标准区,10~15区为自定义符号区。

②16~55区为一级常用汉字区,共有3755个汉字,该区的汉字按拼音排序。

③56~87区为二级非常用汉字区,共有3008个汉字,该区的汉字按部首排序。

④89~94区为用户自定义汉字区。

(3)机内码

汉字的机内码是供计算机系统内部进行存储、加工处理、传输使用的汉字编码,它是国标交换码在机器内部的表示,是在区位码的基础上演变而来的。由于区码和位码的范围都在01~94内,如果直接采用它作为机内码,就会与ASCII码发生冲突,因此对汉字的机内码进行了变换,变换规则如下:

高位内码=区码+20H+80H

低位内码=位码+20H+80H

汉字机内码、国标码和区位码三者之间的关系为:区位码(十进制)的两个字节分别转换为十六进制后加20H得到对应的国标码;国标码的两个字节的最高位分别加1,即汉字交换码(国标码)的两个字节分别加80H得到对应的机内码。

例如,汉字“啊”的区位码(1601)转换成机内码为B0A1H。

(4)字形码

①矢量字体。矢量字体(Vector Font)中每一个字形是通过数学曲线来描述的,它包含了字形边界上的关键点、连线的导数信息等,字体的渲染引擎通过读取这些数学矢量,然后进行一定的数学运算来进行渲染。这类字体的优点是字体实际尺寸可以任意缩放而不变形、变色。矢量字体主要包括Type1、TrueType、OpenType等几类。

矢量字库保存的是对每一个汉字的描述信息,如一个笔画的起始、终止坐标,半径、弧度等。在显示、打印这一类字库时,要经过一系列的数学运算才能输出结果,但是这一类字库保存的汉字理论上可以被无限地放大,笔画轮廓仍然能保持圆滑,打印时使用的字库均为此类字库。Windows使用的字库也为以上两类,在Windows操作系统安装分区根目录下的Fonts文件中,如果字体扩展名为FON,表示该文件为点阵字体文件,扩展名为TTF则表示为矢量字体文件。

②点阵字体。汉字字形码是汉字字库中存储的汉字字形的数据化信息,目前汉字信息处理系统中大多数是以点阵的方式形成汉字。输出汉字时,必须将汉字的机内码转换成以点阵形式表示的字形码。通常汉字的点阵有16×26、24×24、32×32、48×48、64×64、96×96、128×128等。例如,如果一个汉字是由16×16个点阵组成的,则一个汉字占16行,每行上有16个点。通常每一个点用一个二进制的位来表示,值“0”表示暗,值“1”表示亮。因此,一个16×16的点阵字库,存储每个汉字的字形信息需要16×16个二进制位,共32字节。显然点阵密度越大,汉字输出的质量也就越好。图1-8所示为汉字“嘉”的16×16点阵字形。

图1-8 点阵字形

点阵字体的优点是显示速度快,不像矢量字体需要计算;其最大的缺点是不能放大,一旦放大后会使字形失真,从而文字边缘出现马赛克式的锯齿形状。

4.Unicode编码

Unicode字符集编码是通用多八位编码字符集(Universal Multiple-Octet Coded Character Set)的简称,支持世界上超过650种语言的国际字符集。Unicode允许在同一服务器上混合使用不同语言组的不同语言。它是由一个名为Unicode学术学会(Unicode Consortium)的机构制定的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理及显示。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

Unicode标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”。例如,字母A的编码为004116,所以A的编码书写为“U+0041”。

UTF-8是Unicode的其中一个使用方式。UTF-8便于不同的计算机之间使用网络传输不同语言和编码的文字,使得双字节的Unicode能够在现存的处理单字节的系统上正确传输。UTF-8使用可变长度字节来存储Unicode字符。例如,ASCII字母继续使用1字节存储,重音文字、希腊字母或西里尔字母等使用2字节来存储,而常用的汉字就要使用3字节来存储,辅助平面字符则使用4字节。

UTF-32、UTF-16和UTF-8是Unicode标准的编码字符集的字符编码方案,UTF-16使用一个或两个未分配的16位代码单元的序列对Unicode代码点进行编码;UTF-32即将每一个Unicode代码点表示为相同值的32位整数。