第3章计算机中数据的表示与运算 本章学习目标  了解计算机内数值数据和非数值数据的组织格式和编码规则  掌握数值数据中指导计算机进行算数运算的理论基础——进位计数制、小数点的处理以及符号的表示  熟练掌握进位计数制、补码及浮点数 计算机所要处理的对象是数据信息,而指挥计算机操作的信息是控制信息。因此,可以把计算机的内部信息分为数据信息和控制信息两大类。其中,数据信息包括数值数据和非数值数据,非数值数据包括逻辑数据、字符数据(字母、符号、汉字)以及多媒体数据(图形、图像、声音)等,控制信息包括指令和控制字。 在计算机内部,信息的表示依赖于机器硬件电路的状态。数据采用什么表示形式,直接影响到计算机的性能和结构。应该在保证数据性质不变和工艺许可的条件下,尽量选用简单的数据表示形式,以提高机器的效率和通用性。 本章将使学生在了解计算机内数值数据和非数值数据的组织格式和编码规则的基础上,掌握计算机内数据信息的表示。其中,数值数据中指导计算机进行算术运算的理论基础——进制、补码、浮点数将作为学习的重点。 3.1数 值 数 据 数值数据是指具有确定的数值,能表示其大小,在数轴上能够找到对应点的数据。 在现实生活中习惯采用十进制来表示数据,而计算机却用二进制表示信息。计算机采用二进制原因如下: (1) 二进制表示数据便于物理实现。在物理器件中,具有两个稳定状态的物理器件是很多的(如具有开关两个状态的灯、具有导通和截止两个状态的二极管、具有闭合和断开两个状态的开关等),恰好可以利用器件的两个状态对应表示二进制的0和1两个数字符号; 而十进制具有从0到9的10个数字符号,要找到具有10个稳定状态的物理器件几乎是不可能的。这也是计算机采用二进制表示数据的最重要的理由。 (2) 二进制表示数据运算简单。用二进制表示数据,在做加法和乘法运算时,只需要记住0和0、0和1、1和1,2×(2+1)/2共3对数的和与积就可以了,而十进制运算却要考虑10×(10+1)/2共55对数的和与积。计算机采用二进制表示数据,其运算器件的电路实现起来十分简单。 (3) 二进制表示数据工作可靠。如果要采用十进制表示信息,那么,由于具有10个稳定状态的物理器件是不存在的,只能用器件的物理量来代表十进制的数字符号(如用电流量、电压的高低,假如用流过导线的电流量表示信息,0~0.1安培代表“0”、0.1~0.2安培代表“1”、0.20.3安培代表“2”……); 而二进制的表示,完全可以用物理器件的“质”来表示,比如用二极管的导通和截止或灯的亮与灭分别代表二进制的“0”和“1”。如果电路电压不够稳定,通过导线的电流量变化零点几安培是完全有可能的,而二极管导通与截止、灯的亮与灭的状态的跳变却不可能由电路电压的不稳定造成。也就是说用“质”来区分数字符号的二进制要比用“量”来区分数字符号的十进制工作起来稳定得多。 (4) 二进制表示数据便于逻辑判断。逻辑判断中,只有“是”和“非”两种状况,似是而非的状况是不存在的。正好可以用二进制的0和1分别代表逻辑判断的是与非。 当然,二进制表示数据也有它的不足,即它表示的数容量小。同样是n位数,二进制最多可表示2n个数,而十进制可以表示10n个数。如3位二进制数,可以表示从二进制的000到二进制的111一共8个数; 而3位十进制数却可以表示从十进制的000到十进制的999共1000个数。 尽管二进制表示数据也有它的缺点,但基于它所带来的方便与简洁,计算机采用了二进制作为信息表示的基础。 十进制和二进制表示数据都是采用进位计数制。因此,要研究计算机内数值数据的表示,首先要研究进位计数的理论。不仅如此,还要考虑小数点和符号在计算机内如何处理。 所以,表示一个数值数据要有三个要素: 进制、小数点和符号。 3.1.1进位计数制及进制间的相互转换 本节介绍各种进位制结构的特性,以及它们之间的相互转换。 1. 进位计数制 为了协调人与计算机所用进制之间的差别,必须研究数字系统中各种进位制结构的特性,以及它们之间的相互转换,从中找出规律性的东西。下面,从我们习惯的十进制开始,系统研究进位计数制。 1) 十进制及十进制数 十进制采用逢十进一的进位规则表示数字。具体规则如下: (1) 十进制用0,1,…,9十个数字符号分别表示0,1,…,9十个数。 (2) 当要表示的数值大于9时,用数字符号排列起来表示,表示规则如下:  数字符号本身具有确定的值。  不同位置的值由数字符号本身的值乘以一定的系数表示。  系数为以10为底的指数。 (3) 一个数的实际值为各位上的实际值总和。如: 1966298.735=1×106+9×105+6×104+6×103+2×102+9×101+ 8×100+7×10-1+3×10-2+5×10-3 2) R进制及R进制数 通过对十进制的总结,可以得出任意(R)进位数按逢R进一的规则表示数字的规则如下。 (1) R进制用0,1,…,R-1共R个数字符号分别表示0,1,…,R-1共R个数。这里的R为数制系统所采用的数字符号的个数,被称为基数。 (2) 当要表示的数值大于R-1时,用数字符号排列起来表示,表示规则如下。  数字符号本身具有确定的值。  不同位置的值由数字符号本身的值乘以一定的系数表示。  系数为以R为底的指数。  假设数字符号序列为 xn-1xn-2…xi…x1x0.x-1x-2…x-m 通常在数字符号序列后面加上标注以示声明,如上面的R进制数表示为: (xn-1xn-2…xi…x1x0.x-1x-2…x-m)R。xi为0和R-1之间的整数; xi的下标为数字符号的位序号,它所代表的值为x×Ri。系数Ri(R位序号)被称为xi所在位置的权。 (3) 一个数的实际值为各位上的实际值总和。如 x=xn-1xn-2…xi…x1x0.x-1x-2…x-m V(x)=xn-1×Rn-1+xn-2×Rn-2+…xi×Ri+…x1×R+x0×R0+ x-1×R-1+x-2×R-2+…x-m×R-m 即 V(x)=∑n-1i=0xi×Ri+∑-mi=-1xi×Ri V(x)表示x的值,m、n为正整数。 3) 二进制及二进制数的运算 二进制采用逢二进一的进位规则表示数字,采用0和1两个数字符号。二进制的运算规则如下。 (1) 加法规则: “逢2进1”。 0+0=00+1=1+0=11+1=10 【例31】求1010.110+1101.010。 解:1010.110 + 1101.010 11000.000 结果: 1010.110+1101.100=11000.000 (2) 减法规则: “借1当2”。 0-0=01-0=11-1=010-1=1 【例32】求11000.000-1101.010。 解:11000.000 - 1101.010 1010.110 结果: 11000.000-1101.010=1010.110 (3) 乘法规则。 0×0=00×1=01×0=01×1=1 由规则可以看出,二进制乘法要远比十进制乘法简单。 【例33】求1010.11×1101.01。 解:1010.11 × 1101.01 10.1011 000.000 1010.11 00000.0 101011 101011 10001110.0111 结果: 1010.11×1101.01=10001110.0111 在乘法运算的过程中,由于乘数的每一位只有0和1两种可能,那么,部分积也只有0和乘数本身两个值(不考虑小数点的位置)。根据这一特点,可以把二进制的乘法归结为移位和加法运算,即通过测试乘数的相应位是0还是1决定要加的部分积是0还是被乘数。 (4) 除法规则。 【例34】求10001110.0111÷1010.11。 解: 结果: 10001110.0111÷1010.11=1101.01 除法是乘法的逆运算,可以归结为与乘法相反方向的移位和减法运算。因此,在计算机中,使用具有移位功能的加法/减法运算,就可以完成四则运算。 这里所举的例子恰好是可以整除的,最后的余数是0000.00。如果是不可以整除的,那么在商达到了足够的精度后,最下面的部分就是余数。 4) 八进制与十六进制 除了二进制与十进制外,八进制与十六进制由于其与二进制的特殊关系(8=23,16=24) 也常被使用。一般在机器外部,为了书写方便,也为了减少书写错误,常采用八进制与十六进制。八进制的基数为8,采用逢八进一的原则表示数据,权值为8位序号,数字符号为0、1、2、3、4、5、6、7; 十六进制的基数为16,采用逢十六进一的原则表示数据,权值为16位序号,数字符号为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。十六进制后面常加后缀H以示用于表示数字符号的A、B、C、D、E、F与字母的区别,如13AH、E25等。 二、 八、十、十六进制之间的关系表示如表3.1所示。 表3.1四种进位计数制 二 进 制 数八 进 制 数十 进 制 数十六进制数 0000 0 0 0 0001 1 1 1 0010 2 2 2 0011 3 3 3 0100 4 4 4 0101 5 5 5 0110 6 6 6 0111 7 7 7 1000 10 8 8 1001 11 9 9 1010 12 10 A 1011 13 11 B 1100 14 12 C 1101 15 13 D 1110 16 14 E 1111 17 15 F  101101 55 45 2C 01101011153107 6B 11001101063241019A 2. 进制间的相互转换 1) 十进制转换为R进制 将十进制数转换为R进制数时,可以将数分为整数和小数两部分分别转换,然后再组合起来即可实现整个转换。 假设某十进制的数已转换为R进制的数,数字符号序列为: xn-1xn-2…x1x0.x-1x-2…x-m (1) 整数部分。 V(x)=xn-1xn-2…xi…x1x0 =x0+ x1×R1+x2×R2+…xi×Ri+…xn-2×Rn-2+ xn-1×Rn-1 若将其除以R,可得: V(x)/R=Q0/R =x0+R×(x1+x2×R1+…+xi×Ri-1+…+xn-1×Rn-2) =x0+Q1 其中,x0为小于R的数,所以x0为余数,Q1为商。 再将Q1除以R,可得 Q1/R= x1+Q2 x1为新得到的余数。 依此类推,Qi/R= xi +Qi+1 如此循环下去,直到商为0,就得到了从x0、x1一直到xn-1的数字符号序列。 也就是说,要把十进制的整数转换为R进制的整数时,只需将十进制的整数连续地除以R,其逐次所得到的余数即为从低位到高位的R进制的数字符号序列。 【例35】将(58)10转换为二进制的数。 由此可得(58)10=(111010)2 【例36】将(58)10转换为八进制的数。 由此可得(58)10=(72)8 【例37】将(58)10转换为十六进制的数。 由此可得(58)10=(3A)16 (2) 小数部分。 V(x)=0.x-1x-2…x-m =x-1×R-1+x-2×R-2+…+x-m×R-m 若将其乘以R,可得: V(x)×R=F0×R =x-1+ x-2×R-1+x-3×R-2+…+x-m×R-(m-1) =x-1+F1 其中,x-1为大于1的数,所以x-1为整数,F1为小数部分。 再将F1乘以R,可得: F1×R= x-2+F2 x-2为新得到的整数。 依此类推,Fi×R=x-(i+1)+Fi+1 如此循环下去,直到小数部分为0或商的精度达到要求为止,就得到了从x-1、x-2一直到x-m的数字符号序列。 也就是说,要把十进制的小数转换为R进制的小数数时,只需将十进制的小数连续地乘以R,其逐次所得到的整数即为从x-1到x-m的R进制小数的数字符号序列。 【例38】将(0.5625)10转换为二进制的数。 余数 0.5625整数 ×2 0.1251高位 ×2 0.250 ×2 0.50 ×2 0.01低位 由此可得(0.5625)10=(0.1001)2 【例39】将(0.5625)10转换为八进制的数。 余数 0.5625整数 ×8 0.50004高位 ×8 0.04低位 由此可得(0.5625)10=(0.44)8 【例310】将(0.5625)10转换为十六进制的数。 余数 0.5625整数 ×16 0.00009高位 由此可得(0.5625)10=(0.9)16 【例311】将(0.6)10转换为二进制的数。 余数 0.6整数 ×2 0.21高位 ×2 0.40 ×2 0.80 ×2 0.61 ×2 0.21 ×2 0.40 ×2 0.80 ×2 0.61低位 ×2  由此可得(0.6)10=(0.10011001……)2 小数部分在转换过程中出现了循环,永远也不可能出现0。就要根据需要的精度(或说计算机可能表示的精度)进行截止舍入。 假如要保留小数点后n位,那么至少要求出n-1位整数,然后进行舍入。 下面介绍一下二进制的舍入问题。 (3) 二进制的舍入。 二进制的舍入有两种方法。下面对比进行介绍。  0舍1入法: 被舍去的部分最高位如果为1,就将其加到保留部分的最低位,否则直接舍去。  恒1法: 被舍去的部分如果含有真正的有效数位(即1),就使保留部分的最低位为1(不管其原来是0还是1)。 【例312】将0.101100101保留到小数点后5位。 解: 按0舍1入法保留后的结果为0.10110。 按恒1法舍入后的结果为0.10111。 【例313】将0.101111101保留到小数点后5位。 解: 按0舍1入法保留后的结果为0.11000。 按恒1法舍入后的结果为0.10111。 由上可知,(0.6)10转换为二进制后,若小数点后保留5位,则无论采用0舍1入法还是恒1法,其结果都为(0.10011)2。 上面分别介绍了从十进制到R进制的整数和小数部分的转换。 从上面的例题中可得 (58.5625)10=(111010.1001)2 (58.5625)10=(72.44)8 (58.5625)10=(3A.9)16 2) R进制转换为十进制 按照求值公式得 x=xn-1xn-2…x1x0.x-1x-2…x-m V(x)=∑n-1i=0xi×Ri+∑-mi=-1xi×Ri 基数为R的数,只要将各位数字与它所在位置的权Ri(R位序号)相乘,其积相加(按逢十进一的原则),即为相应的十进制数。 【例314】将(21A.8)16、(3A.9)16转换为十进制的数。 解: V((21A.8)16)=2×162+1×161+10×160+8×16-1 =2×256+1×16+10×1+8/16=538.5 V((3A.9)16)=3×161+10×160+9×16-1 =3×16+10×1+9/16=58.5625 由此可得(21A.8)16=(538.5)10,(3A.9)16=(58.5625)10 【例315】将(72.44)8转换为十进制的数。 解: V((72.44)8))=7×8+2×80+4×8-1+4×8-2 =7×8+2×1+4/8+4/64=58.5625 由此可得(72.44)8=(58.5625)10 【例316】将(111010.1001)2转换为十进制的数。 解: V((111010.1001)2)=1×25+1×24+1×23+0×22+1×21+0×20 +1×2-1+0×2-2+0×2-3+1×2-4 =32+16+8+2+0.5+0.625=58.625 由此可得(111010.1001)2=(58.5625)10 3) 二、八、十六进制间的相互转换 二进制、八进制与十六进制之间的转换由于它们之间存在着权的内在联系而得到简化。由于24=16、23=8,所以,每一位十六进制数相当于四位二进制数,而每一位八进制数相当于三位二进制数。 (1) 二进制转换为八进制或十六进制。 可将二进制的3位或4位一组转换为一位八进制或十六进制数。在转换中,位组的划分是以小数点为中心向左右两边延伸的,不足者补齐0。整数部分在高位补0,小数部分在低位补0。 【例317】将(111010.1001)2转换为八进制的数。 解: 位组划分: 111010 . 100 100 八进制数: 7244 由此可得(111010.1001)2=(72.44)8 【例318】将(111010.1001)2转换为十六进制的数。 解: 位组划分: 00111010 . 1001 十六进制数: 3A9 由此可得(111010.1001)2=(3A.9)16 (2) 八进制或十六进制转换为二进制。 将每一位八进制或十六进制数转换为3位或4位的一组二进制数。 【例319】将(D3A.94)16转换为二进制的数。 解: 十六进制数: D3A . 94 ↓↓↓↓↓ 相应二进制数: 1101 0011 1010 1001 0100 由此可得(D3A.94)16=(110100111010.100101)2 【例320】将(376.52)8转换为二进制的数。 解: 八进制数: 376 . 52 ↓↓↓↓↓ 相应二进制数: 011 111 110 101 010 由此可得(376.52)8=(11111110.10101)2 掌握了二、八、十六进制之间的内在联系,在它们之间的数制转换就不必用十进制作为桥梁,既方便又不容易出错。 3.1.2定点数与浮点数 在前面的内容中,介绍了进位计数制。在掌握了计算机内的二进制表示及二进制与其他进位计数制之间的相互转换之后,再来看一下小数点在计算机内是如何处理的。 数既可以是整数,也可以是小数。但是,计算机并不识别小数点。这就引出了小数点在机器内如何处理的问题。 计算机处理小数点的方式有两种: 定点表示法和浮点表示法。定点表示法中,所有数的小数点都固定到有效数位间的同一位置; 浮点表示法中,一个数的小数点可以在有效数位间任意游动。 小数点的位置固定不变的数称为定点数; 小数点可以在有效数位间任意游动的数为浮点数。 采用定点表示法的计算机被称为定点机; 采用浮点表示法的计算机称为浮点机。 假设一个二进制数X,可以表示为 X=2E×M 其中,E是一个二进制整数,称为X的阶; 2为阶的基数; M称为数X的尾数。尾数表示X的全部有效数字,而阶E指明该数的小数点的位置,阶和尾数都是带符号的数。在机器内部表示时,需要表示尾数和阶,至于基数和小数点,是不需要用任何设备表示的。关于正负号表示,将在后面进行介绍。 定点表示法中所有数的E值都相同。浮点表示法中一个数的E值就可以有多个,不同的E值,其尾数中小数点的位置就不同。 比如: 0.10、10.101和1011.011这三个数,在八位字长的时候,如果小数点固定在第4位和第5位之间,那么它们分别为 0000.1000、0010.1010及1011.0110。 而浮点表示中,一个数就可以因小数点在有效数位间任意移动而有多种表示。如: 0.1011011=0.001011011×22=101.1011×2-3 100.10000=0.1001×23=1001×2-1 下面分别介绍定点数和浮点数。 1. 定点数 1) 定点整数和定点小数 计算机内,通常采取两种极端的形式表示定点数。要么所有数的小数点都固定在最高位,称为定点的纯小数机; 要么所有数的小数点都固定在最低位,称为纯整数机。 在定点的纯小数机中,若不考虑符号位,那么数的表示可归纳为: 0.x-1x-2…x-m,其中xi为各位数字符号,m为数值部分所占位数; 0和小数点不占表示位,只是为了识别方便,在表示的时候才书写出来,而在机器中,小数点的位置是默认的,无须表示。 定点的纯整数机中,数的表示可归纳为xn-1xn-2…xi…x1x0,其中,xi为各位数字符号; n为数值部分所占位数。 2) 定点数的表示范围 (1) n位定点小数的表示范围。 最大数: 0.11…11 最小数: 0.00…01 范围: 2-n≤|x|≤1-2-n (2) n位定点整数的表示范围。 最大数: 11…11 最小数: 0 范围: 0≤|x|≤2n-1 如果运算的数小于最小数或大于最大数,则产生溢出。这里所说的溢出是指数据大小超出了机器所能表示的数的范围。 当数据大于机器所能表示的最大数时,就产生了上溢; 而数据小于机器所能表示的最小数时,就产生了下溢。 一般下溢可当成0处理,不会产生太大的误差。如果参加运算的数、中间结果或最后结果产生上溢,就会出现错误的结果。因此,计算机要用溢出做标志迫使机器停止运行或转入出错处理程序。早期,程序员使用定点机进行运算要十分小心,常常通过选用比例因子来避免溢出的发生。 3) 比例因子及其选取原则 在纯小数机或纯整数机中,若要表示的数不在纯小数或纯整数的范围之内,就要将其乘上一定的系数进行缩小或扩大为纯小数或纯整数以适应机器的表示,在输出的时候再做反方向调整即可。这个被乘的系数,称之为比例因子。 从理论上讲,比例因子的选择是任意的,因为尾数中小数点的位置可以是任意的。 比例因子不能过大。如果比例因子选择太大,将会影响运算精度。比如N=0.11,机器字长为4位,则: 当比例因子为2-1时,相乘后的结果为0.011; 当比例因子为2-2时,相乘后的结果为0.001; 当比例因子为2-3时,相乘后的结果为0.000。 比例因子也不能选择过小。比例因子太小有可能使数据超出机器范围。如0.0110+0.1101=1.0011。纯小数相加,产生了整数部分。 在选取比例因子时,必须要保证初始数据、预期的中间结果和运算的最后结果都在定点数的表示范围之内。 4) 定点数的优缺点 定点数的最大优点是其表示简单,电路相对实现起来就容易,速度也比较快,但由于其表示范围有限,所以很容易产生溢出。 2. 浮点数 1) 浮点数的两部分 在机器内部,浮点数由阶和尾数两部分构成。尾数部分必须为纯小数; 而阶的部分必须为纯整数。 例如: -0.101100×2-1011。 在表示浮点数的时候,除了要表示尾数和阶的数值部分,还要表示它们的符号。所以,要完整地表示一个浮点数,须包括阶的符号(阶符)、阶的数值(阶码)、尾数的符号(尾符)、尾数的数值(尾码)四部分。它们的顺序与位置在不同的机器中会有所不同,但必须完整表示这四部分。 2) 浮点数的表示范围 假设浮点数的尾数部分数值位为n位,阶的部分数值位为l位,那么,它的表示范围为 最大数: 0.11……11×2+11…11 最小数: 0.00……01×2-11…11 范围: 2-(2l-1)×2-n≤|x|≤(1-2-n)×2+(2L-1) 可以看出,浮点数的表示范围要远远超过定点数的表示范围。浮点数的最大数和最小数要比定点小数的最大数和最小数大或小2+(2L-1)倍。 3) 浮点数的优缺点 从上面的形式可以看出,要表示一个浮点数,其实现要比定点数的复杂,因而速度也会有所下降; 但它的表示范围和数的精度要远远高于定点数。 4) 浮点数的规格化 一个数所能保留的有效数位越多,其精度也就越高。 假如有下面三个浮点数: A=0.001011×200; B=0.1011×2-10; C=0.00001011×2+10。 这实际是同一个数的三个不同表示形式。 现在依据机器的要求,尾数的数值部分只能取4位,那么,在考虑舍入的情况下,三个数变为: A=0.0010×200; B=0.1011×2-10; C=0.0000×2+10。 A只保留了两个有效数位,B保留了全部的有效数位,而C却丢失了全部的有效数位。 如何尽可能地利用有限的空间保留尽可能多的有效数位呢?总结一下,可以发现: 尾数部分的有效数位最高位的1越接近小数点,它的精度就越高。于是,要想办法使浮点数的尾数部分的最高位为1赢取最高的精度。这就涉及浮点数的规格化的问题。 所谓浮点数的规格化是指: 在保证浮点数值不变的前提下,适当调整它的阶,以使它的尾数部分最高位为1。 规格化浮点数尾数部分的数值特征为0.1X……XX,即12≤|m|<1。 3. 定点数与浮点数的比较 一台计算机究竟采用定点表示还是浮点表示,要根据计算机的使用条件来确定。定点表示与浮点的比较见表3.2。 表3.2定点表示与浮点表示的比较 比较项定 点 表 示浮 点 表 示 表示范围较小比定点范围大 精度决定于数的位数规格化时比定点高 运算规则简单运算步骤多 运算速度快慢 控制电路简单,易于维护复杂,难于维护 成本低高 程序编制选比例因子,不方便方便 溢出处理由数值部分决定由阶大小判断 从上面的介绍可以看出,定点数无论在数的表示范围、数的精度还是溢出处理方面,都不及浮点数。但浮点数的线路复杂,速度低。因此,在要求精度和数的范围的情况下,采用定点数表示方法往往更快捷、经济。 一台机器可以采用定点数表示,也可以采用浮点数表示; 但同时只能采用一种方式。相应地,机器被称为定点机或浮点机。 3.1.3数的符号表示——原码、补码、反码 前面讨论了数的进制和小数点的处理。要真正表示一个数,还要考虑它的符号。数的符号是如何被处理的呢?下面来讨论计算机内处理带符号数的二进制编码表示系统——码制。 1. 机器数与真值 二进制的数也有正负之分,如A=+1011,B=-0.1110,A是一个整数,而B是一个负数。然而,机器并不能表示“+”“-”。为了在计算机中表示数的正负,引入了符号位,即用一位二进制数表示符号。这被称之为符号位的数字化。 为了方便区分计算机内的数据和实际值,引入机器数和真值的概念。 真值: 数的符号以通常的习惯用“+”“-”表示。 机器数: 数的符号数字化后用“0”“1”表示。 数的符号数字化后,是否参加运算?符号参加运算后数值部分又如何处理呢?计算机内有原码、补码、反码三种机器数形式,还有专门用于阶的移码形式。下面分别介绍。 2. 原码表示法 数的符号数字化后用“0”和“1”来表示,用户最自然的是想到用“0”和“1”在原来的“+”“-”号位置上简单取代。这也正是原码表示法的基本思想。 在原码表示法中,用机器数的最高位表示符号,0代表正数,1代表负数; 机器数的其余各位表示数的有效数值,为带符号数的二进制的绝对值。所以,原码又称符号绝对值表示法。 【例321】原码表示法。 [+1010110]原=01010110 [- 1010110]原=11010110 [+0.1010110]原=0.1010110 [- 0.1010110]原=1.1010110 数的符号数值化后,就可把原码的定义数学化出来。下面系统研究原码。 1) 原码的数学定义 n字长定点整数(1位符号位,n-1位数值位)的原码数学定义为 [x]原=x,0≤x<2n-1 2n-1+|x|,-2n-1N↑nEsc 1111SIUS/?O↓oDel 为了构成一个字节,ASCII码允许加一位奇偶校验位,一般加在一个字节的最高位,用作奇偶校验。通过对奇偶校验位设置“1”或“0”状态,保持8位字节中的“1”的个数总是奇数(称奇校验)或偶数(称为偶校验),用以检测字符在传送(写入或读出)过程中是否出错。 表3.5中的ENQ(查询)、ACK(肯定回答)、NAK(否定回答)等,是专门用于串行通信的控制字符。 在ASCII码字符表中查找一个字符所对应的ASCII码的方法是: 向上找b6b5b4向左找b3b2b1b0。例如,字母J的ASCII码中的b6b5b4为100B(5H),b3b2b1b0为1010B(AH)。因此,J的ASCII码为1001010B(5AH)。 ASCII码也是一种0,1码,把它们当作二进制数看待,称为字符的ASCII码值。用它们代表字符的大小,可以对字符进行大小比较。 1981年,我国参照 ASCII码颁布了国家标准《信息处理交换用汉字编码字符集——基本集》,与ASCII码基本相同。 2. 汉字编码 由于信息在计算机中都是以二进制形式存在的,若想让计算机能够存储和处理汉字,也必须对汉字进行编码,为每个汉字分配一个唯一的二进制代码。汉字信息处理必须考虑汉字的输入、存储以及显示。汉字编码包括将汉字输入计算机的汉字输入码、将汉字存储在计算机内的汉字机内码以及将汉字在输出设备上显示出来的汉字字形码。 计算机进行汉字处理的过程如图3.1所示。 图3.1计算机进行汉字处理的过程 用户按照一定的输入方法(拼音、偏旁部首、数字等)输入汉字信息,相应的输入程序将输入码转换成计算机机内码存储在计算机内; 需要输出的时候,相应的程序再通过调用相应字库里的字模信息将机内码转换成字形码,并以汉字的形式显示出来。 内码与字符是一一对应的,而外码(输入码)与内码具有多对一的关系,字库(输出码)与内码也是多对一的关系。 1) 汉字输入码 将汉字输入计算机,有模式识别输入和汉字编码输入两种途径。 (1) 通过模式识别输入。模式识别是指对表征事物或现象的各种形式的(数值的、文字的和逻辑关系的)信息进行处理和分析,以及对事物或现象进行描述、辨认、分类和解释的过程,是信息科学和人工智能的重要组成部分。模式识别法输入即指计算机通过“视觉”“听觉”及“触觉”装置(如扫描仪、话筒、手写板、触摸屏等)提取相应的输入信息,再经过模式识别软件的处理、辨识与解释,形成相应的汉字并转换成机内码的过程。 (2) 通过汉字编码输入。用户借助输入设备(通常为键盘)并根据一定的编码方法通过相应的输入方法将汉字输入计算机。如何利用标准英文键盘输入汉字,目前已提出的方法约有2000种,可分为以下几类:  汉字拼音输入码,如全拼码、双拼码等;  汉字字形编码,如五笔字型码、首尾码、101码等;  汉字音形编码;  汉字数字编码,如区位码、电报码等。 每一种汉字输入程序的基本功能都是将输入码转换成机内码。 2) 汉字机内码 机内码是指计算机系统内部处理和存储字符时使用的代码。 由于英文处理比较简单,所以其机内码就是ASCII码。ASCII码用8位二进制数表示一个字符,其中第1位是奇偶校验位。 汉字被许多国家和地区所使用,所以目前存在多种汉字机内码标准。常用的汉字编码标准有GB 2312—1980、GB 18030—2000和BIG5码。这些码简称国标码,经过适当的转换(以区别于基本字符编码ASCII码),称为汉字在计算机内存储的机内码。 (1) GB 2312—1980码。GB 2312—1980码也称为国标交换码、国标码和GB码,是中华人民共和国国家汉字信息交换用途码,全称《信息处理交换用汉字编码字符集——基本集》,由国家标准总局于1981年发布。GB 2312共收录6763个汉字及682个图形字符。 (2) GB 18030—2000码。GB 18030—2000码是最新的汉字编码字符集国家标准,向下兼容GBK和GB 2312—1980标准。GB 18030编码根据Unicode标准对GBK进行了扩充,在双字节接触上对生僻字采用四字节进行编码,共收录了27533个汉字,还收录了日文、朝鲜语和中国藏族、蒙古族等少数民族的文字。 (3) BIG5码。BIG5码是通行于我国台湾、香港地区的繁体汉字编码方案,也称为大五码。它是双字节编码方案,共收录了13461个汉字和符号。 总之,不管是用哪一种输入码输入的汉字,以什么编码标准方案进行的转换,在计算机内部存储时,都使用机内码。这也是为什么用一种汉字输入法输入的文档也可以用另一种汉字输入法对其进行修改的原因之所在。 3) 汉字字形码 字库也称为字形码或字模码,与机内码是多对一的关系,一个机内码对应多个字模码,用于输出不同的字形,可以将内码转换成各种不同的字形。或者说,不同的字体有不同的字库。简单地说,输出时机内码作为字库的地址,选定了字体后,每一个机内码驱动一个字将其输出。全部汉字字形的集合叫作汉字字形库(简称汉字库)。汉字的字库分为点阵字库和矢量字库两类。 (1) 点阵字库。点阵字库就是将每个汉字(包括一些特殊符号)看成是一个矩形框内的一些横竖排列的点的集合,有笔画的位置用黑点表示,无笔画的位置用白点表示,分别对应二进制的1和0,将这些点阵信息记录下来,就成了字库。一般汉字系统中汉字字形的点阵规格有16×16、24×24、48×48几种。点阵越大,每个汉字的笔画越清晰,打印质量也就越高。点阵字库显示或打印速度快,但占用存储空间大,且不能缩放。假设每个汉字由16×16点阵组成,那么,需要占32个字节; 24×24点阵需要占72个字节( 每个汉字字模占用的字节数=点阵行数×点阵列数/8)。点阵字库常用于针式打印机和屏幕显示。 (2) 矢量字库。保存的是汉字的笔画轮廓信息,包括组成汉字的每一个笔画的起点坐标、终点、半径、弧度等。在显示和打印这类字库的字形,要经过一系列的数学运算才能输出结果。矢量字库的汉字显示速度慢,但占用存储空间小,汉字可任意缩放。缩放后的笔画轮廓仍能保持圆滑、流畅。矢量字库多用于激光打印机和绘图仪。 3.2.4多媒体数据 多媒体数据包括文字、声音、图形、图像及视频数据。文字可以理解为字符。在前面已经叙述过了,此处不再赘述。 1. 声音编码 1) 音调、音强和音色 声音是通过声波改变空气的疏密度,引起鼓膜振动而作用于人的听觉的。从听觉的角度,音调、音强和音色称为声音的三要素。 音调决定于声波的频率。声波的频率越高,则声音的音调越高; 声波的频率越低,则声音的音调越低。人的听觉范围为20Hz~20kHz。 音强又称响度,决定于声波的振幅。声波的振幅越高,则声音越强; 声波的振幅越低,则声音越弱。 音色决定于声波的形状。混入音波基音中的泛音不同,得到不同的音色。 图3.2形象地说明了两种不同的声音的三要素的不同。 图3.2两种不同声音的三要素 显然,声音媒体的质量主要决定于它的频宽。 2) 波形采样量化 任何用符号表示的数字都是不连续的。如图3.3所示,波形的数字化过程是将连续的波形用离散的(不连续的)点近似代替的过程。在原波形上取点,称为采样。用一定的标尺确定各采样点的值(样本),称为量化(见图3.3中的粗竖线)。量化之后,很容易将它们转换为二进制(0,1)码(见图3.3中的表)。 图3.3波形的采样与量化 3) 采样量化的技术参数 一个数字声音的质量,决定于下列技术参数。 (1) 采样频率。 采样频率即一秒内的采样次数,它反映了采样点之间的间隔大小。间隔越小,丢失的信息越少,数字声音越细腻逼真,要求的存储量也就越大。由于计算机的工作速度和存储容量有限,而且人耳的听觉上限为 20kHz,所以采样频率不能也不需要太高。根据奈奎斯特采样定律,只要采样频率高于信号中的最高频率的两倍,就可以从采样中恢复原始的波形。因此,40kHz以上的采样频率足以使人满意。目前,多媒体计算机的标准采样频率有 3个: 44.1kHz、22.05kHz和 11.025kHz。CD唱片采用的是 44.1kHz。 (2) 测量精度。 测量精度是样本在纵向方向的精度,是样本的量化等级,它通过对波形纵向方向的等分而实现。由于数字化最终要用二进制数表示,所以常用二进制数的位数表示样本的量化等级。若每个样本用8位二进制数表示,则共有28=256个量级。若每个样本用16位二进制数表示,则共有216=65536个量级。量级越多,采样越接近原始波形; 数字声音质量越高,要求的存储量也越大。目前,多媒体计算机的标准采样量级有8位和16位两种。 (3) 声道数。 声音记录只产生一个波形,称为单声道。声音记录产生两个波形,称为立体声双声道。立体声比单声道声音丰满、空间感强,但需两倍的存储空间。 2. 图形与图像编码 图形(Graphic)和图像(Image)是画面在计算机内部的两种表示形式。 图像表示法是将原始图画离散成m×n个像点像素组成的矩阵。每一个像素根据需要用一定的颜色和灰度表示。对于GRB空间的彩色图像,每个像素用3个二进制数分别表示该点的红(R)、绿(G)、蓝(B)3个彩色分量,形成3个不同的位平面。此外,每一种颜色又可以分为不同的灰度,当采用256个灰度等级时,各位平面的像素位数都为8位。这样,对于RGB颜色空间,且具有256个灰度级别时,要用24位二进制数表示(称颜色深度为24)。24位共可以表示224种颜色。图像表示常用于照片以及汉字字形的点阵描述。 图形表示是根据图画中包含的图形要素——几何要素(点、线、面、体)、材质要素、光照环境和视角等进行描述表示。图形表示常用于工程图纸、地图以及汉字字形的轮廓描述。 3.3数据校验编码 计算机系统工作过程中,由于脉冲噪声、串音、传输质量等原因,有时在信息的形成、存取、传送中会发生错误。为减少和避免这些错误,一方面要提高硬件的质量,另一方面可以先对要传输的数据进行编码,使编码后的数据具有检测或者更正错误的功能,再将编码后的数据进行传输。这种具有发现错误,甚至能够更正少量错误的数据编码,称为抗干扰码或数据校验码。 数据校验码的工作原理是: 按一定的规律在有用信息的基础上再附加上一些冗余信息,使编码在简单线路的配合下能发现错误、确定错误位置甚至自动纠正错误。 通常,一个k位的信息码组应加上r位的校验码组,组成k+r位抗干扰码字(在通信系统中称为一帧)。 在现代计算机硬件制造和数据通信领域广泛采用数据编码校验技术来提高数据的可靠性。常用的校验技术有奇偶校验码、循环冗余校验码和汉明校验码等。其中,奇偶校验码和循环冗余校验码主要用于检测数据错误,奇偶校验码主要用于单个字符的错误检测,循环冗余校验码主要用于一批数据的错误检测; 而汉明校验码不但可以检测数据错误,还可以纠正错误。 3.3.1奇偶校验码 奇偶校验码是奇校验码和偶校验码的统称,是一种最基本的检错码。它是在被传输的n位二进制信息元上额外加上1位二进制校验位。如果是奇校验码,在附加上1位校验位后,码长为n+1位的码字中1的个数必须保证为奇数个; 如果是偶校验码,则在附加上1位校验位后,码长为n+1位的码字中1的个数必须保证为偶数个。当采用奇偶校验码时,通信双方必须采用统一的校验方式(奇校验或偶校验)才可正常通信。表3.6给出了几个奇偶校验的例子。 表3.6奇偶校验码示例 原 始 数 据奇校验编码结果偶校验编码结果 01011101010111000101110 00100000001000010010000 10101101101011001010110 表3.6中编码结果中最高位为附加的校验位,低7位为有效数据位,在数据传输和存储前计算校验信息时,有效数据位中的信息要保持不变。 奇偶校验码可以检测出被传输的数据在传输过程中是否出现了差错。当数据进行通信时,需要将位信息元和1位校验元构成的n+1位数据码一起发送,接收方收到数据后重新计算数据中1的个数,由此可知道数据是否正确。例如,通信系统双方约定采用奇校验,发送方发送的每个码字中1的个数一定都是奇数,如果某次通信时因受到外界干扰发生错误,数据中某个位由0变成1,或者由1变成0,则接收到的数据中1的个数就变成了偶数,接收方即可知道数据通信出错。 奇偶校验是一种有效地检测单个错误的方法,但无法判断错误出现的位置。之所以将注意力集中在检测或者纠正单个错误,主要是因为在现代数字通信中发生单个错误的概率要比发生两个或多个错误的概率大得多,要检测或者纠正多位错误,首先要解决单个错误。用奇校验码来检测单个错误,在低速、小批量数据通信情况下会取得良好的效果。另外,奇偶校验码的编码效率很高,n+1的码字中有n位有效数据,其通信效率可达到n/(n+1),随n的增大而趋近于1。 在数字信息传输中,奇偶校验码的编码生成以及编码校验可以用软件实现,也可用硬件电路实现。 假设有效n位数据为X=X0X1…Xn-1,校验位为C,则C可以由下式计算生成: C=X0X1…Xn-1偶校验 C=X0X1…Xn-11奇校验 其中,表示异或运算。 接收方收到数据后,可以用下列验证方程进行校验,若满足方程,则数据正确; 若不满足方程,则接收到的数据有错误。 偶校验方程: CX0X1…Xn-1=0 奇校验方程: CX0X1…Xn-1=1 奇偶校验码目前广泛应用于计算机中内存的数据读/写校验以及单个ASCII码字符传输过程中的数据校验。 3.3.2汉明校验码 汉明校验码是Richard Hamming于1950年提出的,目前被广泛采用的一种很有效的校验方法。它只要增加少数几个校验位,就能提供多位检错信息,以指出最大可能是哪位出错,从而将其纠正。 一般数据校验的基本原理是,在合法的数据编码之间加入一些非法数据编码。发送时,只发送合法的数据编码。如果数据传输过程中出错,将变为非法数据编码,这样接收方即可检测出来。合理安排非法编码数量和编码规则,可以提高检测错误能力,还可以达到纠正错误的目的。 汉明校验码的实现原理是,在k个数据位之外加上r个校验位,从而形成一个k+r位的新的码字,使新的码字的码距比较均匀地拉大。把数据的每一个二进制位分配在几个不同的偶校验位的组合中,当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错,为进一步自动纠错提供了依据。 假设为k个数据位设置r个校验位,则校验位能表示2r个状态,可用其中的一个状态指出“没有发生错误”,用其余的2r-1个状态指出错误发生在哪一位。 3.3.3循环冗余码校验码 循环冗余校验(Cyclic Redundancy Check,CRC)是利用除法及余数的原理来实现错误检测。在发送端根据要传送的k位二进制码序列,用一定的生成多项式产生一个校验用的位——r位校验码(即CRC码),并附在信息后边,构成一个新的二进制码序列,共k+r位,最后一起发送出去。接收方使用相同的生成多项式进行校验,用接收到的数据除以生成多项式,如果能够除尽,则数据正确; 如果不能除尽,则数据错误,并且余数给出了出错位的有关信息,可用于纠正错误。 CRC校验中最关键的是找到满足一定条件的生成多项式。下面列出了国际上常用的CRC循环冗余校验标准生成多项式。 CRC12=X12+X11+X3+X2+X+1 CRC16=X16+X15+X2+1 CRCCCITT=X16+X12+X5+1 CRC32=X32+X26+X23+X16+X12+X11+X10+X8+ X7+X5+X4+X2+X+1 用CRC12生成的CRC码为12位,CRC16和 CRCCCITT生成的CRC码为16位,CRC32生成的CRC码为32位。CRC校验可以完全检测出所有奇数个随机错误和长度小于或等于k(生成多项式的阶数)的突发错误。所以,CRC的生成多项式的阶数越高,那么误判的概率就越小,当然复杂性也随之增加。 CRC校验在磁表面存储器例如硬盘、磁带方面以及计算机高速通信领域得到了应用。例如,著名的通信协议X.25的FCS(帧检错序列)采用的是CRCCCITT,ARJ和LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读/写采用了CRC16,通用的图像存式GIF、TIFF等也采用CRC作为检错手段。 关于汉明码和CRC校验码的更多内容,此不详述。有兴趣的读者可查阅相关文献。 3.4本 章 小 结 本章从进制转换、小数点处理、符号表示几方面系统介绍了计算机内数值数据的表示方法。有关非数值数据的组织格式和编码规则,也作了简要介绍。在学习中,学生要重点掌握进制、补码以及浮点数。 习题 一、 选择题 1. 下列数中,最小的数是()。 A. (101001)2B. (52)8 C. (2B)16D. 45 2. 下列数中,最大的数是()。 A. (101001)2B. (52)8 C. (2B)16D. 45 3. 字长16位,用定点补码小数表示时,一个字能表示的范围是()。 A. -1~(1-2-15)B. 0~(1-2-15) C. -1~+1D. -(1-2-15)~(1-2-15) 4. 若[X]补=10000000,则十进制真值为()。 A. -0B. -127 C. -128D. -1 5. 定点整数16位,含1位符号位,原码表示,则最大正数为()。 A. 216B. 215 C. 215-1D. 216-1 6. 当-1