您好、欢迎来到现金彩票网!
当前位置:秒速时时彩 > 算术上溢 >

计算机组成原理 第2章 计算机中数据信息的表示ppt

发布时间:2019-05-20 15:57 来源:未知 编辑:admin

  1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。

  * * (2) 把M(x)左移k位,得到M(x)? Xk。然后按模2除法,用M(x)? Xk除以G(x)得到k位余数R(x)。即: (3)将M(x)? Xk与余数R(x)作模2相加,即形成循环冗余校验码。 M(x)? Xk+R(x)=Q(x)? G(x)+R(x)+R(x) = Q(x)? G(x) (模2加) 在模2加的条件下,R(x)+R(x)=0。 * * 由于M(x)? Xk+R(x)可被G(x)整除,所以可作为循环冗余码。 因为M(x)左移k位后空出k位,所以与R(x)的模2加可由简单的拼装来实现。 * * 2.6.1 奇偶校验码 奇偶校验码是一种最简单、最常用的校验码,广泛用于主存的读写校验或ASCII码字符传送过程中的检查。 基本原理:在n位有效信息位上增加一个二进制位作为校验位,构成n十1位的奇偶校验码。校验位P的取值(0或1)使n+l位的奇偶校验码中“1”的个数为奇数(称为奇校验Odd)或为偶数(称为偶校验Even)。 校验位的位置在有效信息位的最高位之前或者在最低位之后。 * * 例:A6A5A4A3A2A1A0为7位有效信息,加一个校验位P,构成8位的奇偶校验码为 A6A5A4A3A2A1A0P 或 PA6A5A4A3A2A1A0 若采用偶校验,则: Peven=A6⊕A5⊕A4⊕A3⊕A2⊕A1⊕A0 若采用奇校验,则 Podd = Peven 奇偶校验码的形成 * * 例:求7位信息码1100111的奇校验码和偶校验码(设校验位在最低位)。 解: (1)1100111的奇校验码 因为1100111中“1”的个数为奇,所以奇校验位P=0,1100111的奇校验码为11001110。 (2)1100111的偶校验码 因为1100111中“1”的个数为奇,所以偶校验位P=1,1100111的偶校验码为11001111。 * * 奇偶校验码的校验方法 若接到一奇校验码中“1”的个数为偶数,或接到一偶校验码中“1”的个数为奇数,则表示有一位出错。 以上面的七位有效信息的奇偶校验码为例: 偶校验错: E=A6⊕A5⊕A4⊕A3⊕A2⊕A1⊕A0⊕Peven 奇校验错: E=A6⊕A5⊕A4⊕A3⊕A2⊕A1⊕A0⊕Podd E=0,表示无错; E=1,表示校验出错 * * 奇偶校验码的形成电路 * * 奇偶校验码的校验电路 * * 奇偶校验码的校错能力 奇偶校验码只能发现奇数位个错误,而无法发现偶数位个错误,而且即使发现奇数位个错误也无法确定出错的位置;因而无法自动纠正错误。 但由于现代计算机可靠性比较高,出错概率很低,而出错中只有一位出错的概率最高,因此用奇偶校验检测一位出错,能够满足一般可靠性要求。 在CPU与主存的信息传送过程中,奇偶校验被广泛应用。 * * 课堂练习 (1)假定下列字符码中有奇偶校验位,但没有数据错误,采用偶校验的字符码是 。 A. 11001011 B. 11010110 C. 11000001 D. 11001001 (2)设在7位字符码的最高位加1位奇偶校验位,则下列的奇校验码,出错的是 。 A. 11010101 B. 10010100 C. 01110000 D. 10111000 答案: (1)D;(2)D * * 延展:屠夫砍人游戏 有一个屠夫抓了100人,让他们面朝一个方向排成一坚列,然后给这100人分别戴上帽子,帽子只有黑和白两种颜色,屠夫是随机给他们带上的,且自己看不见自己帽子的颜色,也不能回头,只能看到自己前面人的颜色。 他们的视力很好,排最后的那个人(100号)可以看见前面所有人的帽子颜色,他们的听力都很好,最前面的那个人(1号),可以听见后面所有人说的线号开始要他猜自己帽子的颜色,如果猜中,则生;否,则死。然后又问99号,以此类推。这些人只能回答“黑”或“白”两种答案,如果说这两个字以外的字,所有人都得死。他们都很团结,为了能让最多的人生存,他们愿意牺牲。 问题: 为了能让尽量多的人生存,请你帮他们事先想一个方法。 * * 2.6.2 海明校验码 海明校验码的实质 在奇偶校验的基础上,增加校验位的位数,构成多组奇偶校验,以便发现错误并自动纠正错误。 海明校验码校验位数的选择 设有效信息位的位数为n,校验位数为k,则能够检测一位出错并能自动纠正一位错误的海明校验码应满足下面关系: 2k≥n+k+1 由此式可计算出具有检1纠1错能力的海明校验码中n与k的关系,如表2.6所示。 * * 有效信息位与校验位的关系 * * 海明校验码的编码规则 (1) n位有效信息选择k个校验位,构成n+k位的海明校验码。若校验码位号从左向右(或从右向左)按从1到n+k排列,则校验位的位号分别为2i,i=0,1,2…k-1,有效信息位按原排列次序安排在其它位号中。 例:一个字符的ASCH码为A6A5A4A3A2A1A0,根据表2.6选择k=4。构成7+4=11位的海明校验码。 位号 1 2 3 4 5 6 7 8 9 10 11 编码 P1 P2 A6 P4 A5 A4 A3 P8 A2 A1 A0 P1、P2、P4、P8分别为四个校验位,其下标是它们在海明码中的位号,即20、21、22、23的位置 。 * * (2) k个校验位构成k组奇偶校验,每个有效信息位都被2个或2个以上的校验位校验。被校验的位号等于校验它的校验位位号之和。 如上例中,A6的位号为3,3=1+2,所以A6被P1、P2校验。A3位号为7,7=1+2+4,所以A3被P1、P2、P4校验。以此方法可知每个信息位分别被哪些校验位校验。 A6:P1、P2 A5:P1、P4 A4:P2、P4 A3:P1、P2、P4 A2:P1、P8 A1:P2、P8 A0:P1、P2、P8 * * 由此可得形成k个校验位的校验组 P1:A6、A5、A3、A2、A0 (第一组) P2:A6、A4、A3、A1、A0 (第二组) P4:A5、A4、A3 (第三组) P8:A2、A1、A0 (第四组) (3)统计参与每组奇偶校验的位号,按奇偶校验原理,由已知的有效信息按奇校验或偶校验求出各个校验位,进而形成海明校验码。 * * 例如,按偶校验求出各个校验位的方法是: P1even=A6⊕A5⊕A3⊕A2⊕A0 P2even=A6⊕A4⊕A3⊕A1⊕A0 P4even=A5⊕A4⊕A3 P8even=A2⊕A1⊕A0 按奇校验求出各个校验位的方法是: P1odd=P1even P2odd=P2even P4odd=P4even P8odd=P8even * * 例:编制ASCII字符“M”的海明校验码。 解:“M”的ASCII码为A6A5A4A3A2A1A0=1001101 P1even=A6⊕A5⊕A3⊕A2⊕A0=1⊕0⊕1⊕1⊕1=0 P2even=A6⊕A4⊕A3⊕A1⊕A0=1⊕0⊕1⊕0⊕1=1 P4even=A5⊕A4⊕A3=0⊕0⊕1=1 P8even=A2⊕A1⊕A0=1⊕0⊕1=0 因此得到ASCII码字符“M”的海明校验码为: (偶校验) (奇校验) 海明校验码产生后,将信息位和校验位一起存入内存。 * * 海明校验码的校验方法 校验时,K个校验位进行K组奇偶校验,校验结果形成K位的“指误字” EkEk-1…E2E1。 若某组校验结果正确,指误字相应位为0;若校验结果错误,指误字相应位为1。若校验结果 EkEk-1…E2E1=全0,则表示无错; EkEk-1…E2E1≠全0,则表示有错, 并且指误字代码所对应的十进制值就是出错位的位号。将该位取反,错误码即得到自动纠正。 * * 指误字指示出错的前提是代码中只存在一个错。若有多个错,可能查不出来。 所以只有在只存在一个错的前提下,海明码才能实现检1纠1错。 例:字符“M”的偶校验码为,其指误字为 E1=P1⊕A6⊕A5⊕A3⊕A2⊕A0 E2=P2⊕A6⊕A4⊕A3⊕A1⊕A0 E3=P4⊕A5⊕A4⊕A3 E4=P8⊕A2⊕A1⊕A0 * * 若接收正确,即接收到的代码是,则 E1=0⊕1⊕0⊕1⊕1⊕1=0 E2=1⊕1⊕0⊕1⊕0⊕1=0 E3=1⊕0⊕0⊕1=0 E4=0⊕1⊕0⊕1=0 若接收出错,即接收到的代码是,则 E1=0⊕1⊕0⊕1⊕1⊕1=0 E2=1⊕1⊕1⊕1⊕0⊕1=1 E3=1⊕0⊕1⊕1=1 E4=0⊕1⊕0⊕1=0 * * 得到的指误字为 E4E3E2E1=0110,表示第6位上的数码出错。将第6位上的数码A4取反,即可得到正确结果。 上述海明校验码可以检查出一位错误并予以纠正,但如果有两位信息出错,就无法正确检测并自动纠错。 例:正确的“M”的偶校验海明校验码为 ,如果信息传送时第3位、第6位同时出错,接受到的校验码为 ,校验时,得到指误字为 E4E3E2E1=0101,指出第5位代码出错,结果越纠越错。 * * 扩展海明校验码 为了满足检2纠1错的要求,可将检1纠1错海明校验码再进行奇偶校验。 扩展海明校验码:增加一个奇偶校验位P0,按偶校验规则,P0的取值是使N+K+1位的校验码中的“1”的个数为偶数。即: P0=P1⊕P2⊕A6⊕P4⊕A5⊕A4⊕A3⊕P8⊕A2⊕A1⊕A8 校验时首先由P0对整个n+k+1位海明校验码进行校验,校验结果为E0。 E0=P0⊕P1⊕P2⊕A6⊕P4⊕A5⊕A4⊕A3⊕P8⊕A2⊕A1⊕A8 * * 若校验正确,则E0=0; 若错误,E0=1。然后再按检一纠一错海明校验码对各组进行校验,得到指误字EkEk-1…E2E1。 若校验结果 E0=0,EkEk—l…E1=00…0 表示无错。 E0=1,EkEk—l…E1≠00…0 表示有一位出错,根据EkEk—l…E1的值确定出错位号并自动纠正。 E0=0,EkEk—l…E1≠00…0 表示有两位出错,此时无法确定出错位置,也无法纠错。 E0=1,EkEk—l…E1=00…0 表示P0出错。 * * 在上述校验中,每一个数据位都至少出现在2个Pi值的形成关系中,当任一位数码出错时,必将引起2到3个Pi值发生变化。任何偶数个数出错,E0肯定为0,因此可以区分两位或一位出错。 从上面讨论中,可以看出校验位位数越多,检错纠错的能力就越强。 * * 2.6.3 循环冗余校验码 循环冗余校验码(Cyclic Redundancy Check)简称为CRC码。是一种具有很强检错纠错能力的校验码。 CRC码广泛用于磁盘、磁带等辅助存储器的校验,在计算机网络和通信中亦被广泛采用。 循环冗余校验码通过除法运算来建立有效信息和校验位之间的约定关系。 * * 1. CRC码的编码思想 对于多项式M(x)和G(x)有 * * 如果对于一个M(x),事先按某一G(x)求得Q(x)和R(x)。 传送时,把M(x)-R(x)作为编好的校验码传送,当收到该校验码后仍用原约定的多项式G(x)去除。 若能整除,即余数为0,则表示该校验码正确; 若不能整除,即余数不为0,表明有错,并可根据余数值确定出错位号,进行自动纠正。 * * 由于减余数操作可能涉及到借位运算,难于用简单的拼装方法实现编码。为回避借位,将运算改为模2运算。 循环冗余校验码是一种基于模2运算建立编码规律的校验码, 模2运算:不考虑进位和借位的二进制运算。 2. 模2运算 * * (1) 模2加减:即按位加,用异或规则实现。即: 0±0=0 0±1=1±0=1 1±1=0 (2) 模2乘:按模2加求部分积之和,不进位。 (3) 模2除:按模2减求部分余数,不借位。若部分余数(首次为被除数)最高位为1,则上商为1;若部分余数最高位为0,则上商为0。每求一位商应使部分余数减少一位,即去掉部分余数的最高位,再继续求下一位商。当部分余数的位数小于除数位数时,该余数就是最后的余数。 * * 例2.50 按模2加减规则,计算1100+0110;1010-0111;1010+1010。 可见,在模2加的条件下,R(x)+R(x)=0。 * * 例2.51 按模2乘规则,计算1010×1011;1101×1001。 * * 例2.52 按模2除规则,计算1000000÷1001;1011001÷1101 。 * * 3. CRC码的编码方法 (1) 把待编的n位有效信息表示为多项式M(x), M(x)=Cn-1xn-1+Cn-2xn-2+…+C1x1+C0 Ci=0 或 1 对应M中第i位的信息 例: M(x)=1001=x3+1 选择一个k+1位约定多项式G(x)作为约定除数(又称生成多项式) G(x)=Gkxk+Gk-1xk-1+…+G1x1+G0 例: G(x) =1011 =x3+x1+1 * * 例2.34 二进制编码 00111100和01000110两个字节分别表示ASCII码字符的“”和“F”。 二进制编码 10111100和11000110两个字节一起表示一个汉字的内码。这两个字节是汉字“计”的汉字内码。 * * 4. 汉字字形码 汉字字形码用于记录汉字的外形,是汉字的输出形式。又称字模。主要用于汉字的显示和打印。 汉字字形有两种记录方法 ⑴点阵法 点阵法对应的字形编码称为点阵码。 ⑵矢量法 矢量法对应的字形编码称为矢量码。 * * 点阵法 点阵法用点阵表示汉字字形。根据汉字输出的要求不同,点阵的多少也不同。 简易型汉字为16×16点阵,多用于显示。 提高型汉字为24×24点阵、32×32点阵,48×48点阵、64×64点阵、128×128点阵,甚至更高,多用于打印。 * * 例2.35 16×16的汉字字形点阵,每个汉字要占用32个字节。 * * 对于16×16的汉字字形点阵,国标两级7445个汉字和符号要占用256K字节。如果有4种字体,则需1MB存储空间。 * * 矢量法 矢量码使用一组数学矢量来记录汉字的外形轮廓,矢量码记录的字体称为矢量字体或轮廓字体。 矢量字体能很容易地放大缩小而不会出现锯齿状边缘,屏幕上看到的字形和打印输出的效果完全一致。 * * 曲线法 用若干个直线段和若干个曲线段描述汉字字形。其中曲线段采用二次曲线函数或三次曲线函数进行描述。 在目前使用的系统中,已普遍使用轮廓字体(即True Type字体,采用二次Bezier样条曲线描述字体)。 如中文Windows中提供了宋体、黑体、楷体、仿宋体等True Type字体的汉字库文件。 * * 点阵法中每个汉字占用空间都相同,而不同的汉字矢量表示占用的空间不同。 * * 因为汉字字形码的信息量很大,所占存储空间也很大,因此汉字字形码不用于机内存储,而采用汉字字库存储。 所有的不同字体、字号的汉字字形码构成了汉字字库。只有需要输出汉字时,才将汉字机内码转换为相应的汉字字库地址,检索字库,输出字形码。 目前汉字字库通常是以多个字库文件的形式存储在硬盘上。 * * 随着计算机技术和因特网技术的发展,汉字信息处理的应用范围不断扩大,各种领域对字符集提出了多文种、大字量、多用途的要求,GB2312—80中的6763个汉字明显不够用。为满足各方面应用的需要,国家开始对原来的基本汉字集进行扩充。 * * 1993年国家制定了GB13000.1—1993。该标准采用了全新的多语种编码体系,收录了中、日、韩三国的20902个汉字,称为CJK(Chinese-Japanese-Korean)汉字集。 1995年,全国信息技术标准化技术委员会制定和发布了《汉字扩展规范GBK 1.0》,共收录了21886个简体、繁体汉字和其他符号,并在Windows 95/98 /NT/2000系统中广泛应用。 * * 2000年3月17日,信息产业部和原国家质量技术监督局联合发布了GB 18030—2000《信息技术信息交换用汉字编码字符集基本集的扩充》。 GB18030编码空间约为160万码位,目前已编码的字符约2.6万。随着我国汉字整理和编码研究工作的不断深入,以及国际标准ISO 10646的不断发展,GB18030所收录的字符将在新版本中不断增加。 * * 为了满足不同国家不同语系的字符编码要求,一些计算机公司结成了一个联盟,创立了一个称为Unicode的编码体系。 目前Unicode体系已成为了一种国际标准,即ISO 10646。在Unicode体系中,每个字符和符号被赋予一个永久、惟一的16位值,即码点。 * * Unicode体系目前普遍采用的是UCS-2,即用两个字节来编码一个字符,共有65536个码点,可以表示65536个字符。由于每个字符长度固定为16位,使得软件的编制简单了许多。 UCS-2将世界上几乎所有语言的常用字符都收录其中,包含20902个汉字、(汉字Unicode编码的区间为:0x4E00--0x9FA5),韩文、日文等不同国家的字符以及造字区、保留字符等,共计65534个,方便了信息交流。 Unicode也有UCS-4规范,用4个字节来编码字符。 * * 注意:汉字的输入码、机内码、字形码是计算机中用于输入、内部处理、输出三种不同用途的编码,不能混为一谈。 * * 2.5 十进制数串的表示 为了满足某些应用领域的需要,要求某些计算机内部能直接对十进制数进行运算和处理,为此要求对十进制数字进行二进制编码,且能够便于处理。 * * ⑴采用ASCII码对应的数字编码。 “0”~“9”的ASCII编码为30H~39H。 ⑵采用十进制数字对应的4位二进制数编码。常用的有8421BCD码。 “0”~“9”的8421BCD码为 0000~1001。 例2.36 (786)10=(0)BCD * * 十进制数串在机器内部的表示 1.字符串形式 将十进制数串以字符串形式表示,即一个字节表示一个十进制数位的字符编码或符号编码。 在主存中,一个十进制数串需占用多个连续的字节。为了指明一个十进制数串,需要指明该数串在主存中的起始地址和串的长度。 根据数串中符号所处位置,又分为前分隔数字串和后嵌入数字串两种表示形式。 * * (1) 前分隔数字串 符号位占用单独一个字节,放在数字位之前,即数串最前面的字节中。正号用字符“+”表示,即ASCII码的2BH,负号用字符“-”表示,即ASCII码的2DH。 例2.37 +135 与 -2678 在内存中表示形式为 +135 2BH 31H 33H 35H “+” “1” “3” “5” -2678 2DH 32H 36H 37H 38H “-” “2” “6” “7” “8” * * (2) 后嵌入数字串 符号位不单独占用一个字节,而是嵌入到最低一位数字里面,其规则是:若数串的符号为正,则最低一位数字0~9的ASCII编码不变(30H~39H);若数串的符号为负,把负号变为40H,并将其与最低数值位相加,此时数字0~9的编码变为70H~79H。 例2.38 +135 与 -2678在内存中表示形式为 +135 31H 33H 35H “1” “3” “5” -2678 32H 36H 37H 78H “2” “6” “7” “8” * * 后嵌入表示方式比前分隔方式少用一个字节,但其最低有效位需有特殊编码,既表示该位的数值,又同时表示数的符号。 十进制数的字符串表示主要应用于非数值处理,如显示、打印。但对十进制数的算术运算很不方便,因为每一字节只有低4位表示数值,而高4位在算术运算时不具有数值的意义。 * * 2.压缩的十进制数串 压缩的十进制数串:用一个字节存放两个十进制数位,其值用BCD码表示,符号占半个字节,并存放在最低数值位之后。通常用1100表示正号,1101表示负号。 在这种表示中,规定数字个数加符号位之和必须是偶数,否则在最高位之前补一个0。 例2.39 +135 与 -2678在内存中表示形式为: +135 0001 0011 0101 1100 “1” “3” “5” “+” -2678 0000 0010 0110 0111 1000 1101 “0” “2” “6” “7” “8” “-” * * 压缩的十进制数串既节省了存储空间,又便于直接进行十进制算术运算,是广泛采用的十进制数串表示方式。 与字符串表示方法类似,要指明一个压缩的十进制数,需要给出它在内存中的首地址和串的长度。 * * 2.6 数据校验码 数据在计算机系统内形成、存取和传送过程中,可能会因为某种原因而产生错误。 为减少和避免这类错误,一方面是从电路、电源、布线等方面采取多方面措施提高机器的抗干扰能力,尽可能提高计算机硬件本身的可靠性,另一方面是在数据编码上采取检错纠错的措施。 数据校验码:具有检测某些错误或带有自动纠正错误能力的数据编码方式。 * * 无法检错纠错: 检错与纠错 明天14:00 ~ 16:00开会 明天10:00 ~ 16:00开会 工作人员疏忽 * * 能检错不能纠错: 检错与纠错 明天下午14:00 ~ 16:00开会 明天下午10:00 ~ 16:00开会 工作人员疏忽 根据“下午”与“10:00”信息即可判断出发生了错误,能检错。 不能纠正其错误,因为无法判断是“下午”与“10:00”哪一信息出错,不能纠错。 接收者告诉发送方再发一次, 这就是检错重发 * * 能检错和纠错: 检错与纠错 明天下午14:00 ~ 16:00开会两个小时 明天下午10:00 ~ 16:00开会两个小时 工作人员疏忽 根据“下午”与“10:00”信息即可判断出发生了错误,能检错。 根据开会两个小时判断出“10:00”应该为“14:00”,能纠错。 当然,这显然也增加了信息的冗余,降低了数据处理的效率。但随着数据执行与处理的能力日益增强,可靠性与效率的均衡,这是值得的。 * * 码 距 编码的距离:通常把一组编码中任何两个编码之间代码不同的位数称为这两个编码的距离。 码距:在一组编码中最小的距离称为这组编码的码距,也称海明距离,记作d。 信息序号 二进码字 a2 a1 a0 0 0 0 0 1 0 0 1 2 0 1 0 3 0 1 1 4 1 0 0 5 1 0 1 6 1 1 0 7 1 1 1 编码的距离从1到3不等,但最小值为1,故码距为1 * * 码距与检错纠错能力的关系 (1)在一个码组内为了检测e个误码,要求满足: d=e+1 (2)在一个码组内为了纠正t个误码,要求满足: d=2t+1 码距为1至7的码的纠错和检错能力 码距 码 能 力 检错? 纠错 1 2 3 4 5 6 7 0??? 0 1??? 0 2 或 1 2 加 1 2 加 2 3 加 2 3 加 3 * * 码距与检错纠错的关系举例 用1位长度的二进制编码 若A=1,B=0。这样A,B之间的最小码距为1。 合法码:{0, 1} 非法码:{0, 1} 此编码的检错纠错能力均为0,即无检错纠错能力 假如要对A、B两个字母进行编码。 * * 码距与检错纠错的关系举例 用2位长度的二进制编码 可选用11、00作为合法编码,也可以选用01、10作为合法编码。若以A=11,B=00为例,A、B之间的最小码距为2。 合法码:{11, 00} 非法码:{01, 10} 此编码的检错位数为1位,无法纠错 。 假如要对A,B两个字母进行编码。 * * 码距与检错纠错的关系举例 用3位长度的二进制编码 可选用111,000作为合法编码。A,B之间的最小码距为3。 合法码:{111, 000} 非法码:{001, 010, 011, 100, 101, 110} 此编码的检错位数为2位,纠错位数为1位 。 假如要对A,B两个字母进行编码。 * * 对于绝对值较小的数,为了避免下溢而损失精度,允许采用比最小规格化数还要小的非规格化数来表示。 注意:非规格化数和正、负零的尾数隐含值不是“1”而是“0”。 * * 1. 阶码为全0,尾数为全0 可以表示+0和-0,使0有了精确的表示。 2. 阶码为全0,尾数不为全0 可以表示非规格化数, 表示32位单精度非规格化浮点数,此时的阶码为-126,且隐含位为0。 3. 阶码不为全0和全1 可以表示非0规格化浮点数。 4. 阶码为全1,尾数为全0 可以明确地表示+∞ 和-∞,使计算过程中出现异常时程序也能进行下去。操作数为∞时的处理: ⑴ 产生明确结果 如a/0(a≠0) =±∞ 、3+(+∞) =+∞ 。 ⑵ 产生不发信号的非数值NaN 如+∞+(-∞) 、∞/∞ * * 5. 阶码为全1,尾数不为全0 表示非数值NaN(Not a Number) 分为不发信号(quiet)和发信号(signaling)的非数值,也称“静止的NaN”和“通知的NaN” 。 当尾数最高有效位为1时为不发信号(静止的)NaN,当结果产生这种NaN时,不发例外通知,即可不进行异常处理; 当尾数最高有效位为0时为发信号(通知的)NaN,当结果产生这种NaN时,则发一个异常操作例外通知,表示要进行异常处理。 * * IEEE754单精度浮点数的特征 特征 符号位 1 指数位 8 尾数位 23 总位数 32 指数系统 移码127 指数取值范围 -126~+127 最小规格化数 2-126 最大规格化数 2+128 十进制范围 10-38~+10+38 最小非规格化数 10-45 * * 例2.31 将5/32及 -4120表示成IEEE754单精度格式,并用十六进制书写。 解: (1) (5/32)10 =(0.00101)2=1.01×2-3 按IEEE754单精度格式 得: S=0 M=01000…00 E=127+(-3)=124=(01111100)2 其机器数表示形式为: 0 01111100 00000000 十六进制形式:3E200000H * * (2) (-4120)10=-00 =-1.000000011×212 S=1 M=000000011…00 E=127+12=139=(10001011)2 其机器数表示形式为: 1 10001011 00000000 十六进制形式:C580C000H 注意:在IEEE754单精度格式中尾数默认小数点前为1,即线+实际指数值。 * * 将十六进制的IEEE单精度浮点数代码42E48000转换成十进制数值表示 42E48000=00 按IEEE754标准可写成: 0 10000101 11001000 其中符号位s=0,阶码部分值e=133,尾数部分 f=0.78515625, 根据IEEE754标准的表示公式,得: (-1)0×(1+0.78515625)×2133-127 =1.78515625×26 =114.25 * * IEEE754双精度浮点数格式 64位双精度浮点数表示格式为: 由64位双精度所表示的浮点数 N 的数值为: 1位 11位 52位 S E M 数符 指数 尾数 * * IEEE754双精度浮点数的特征 特征 符号位 1 指数位 11 尾数位 52 总位数 32 指数系统 移码1023 指数取值范围 -1022~+1023 最小规格化数 2-1022 最大规格化数 2+1024 十进制范围 10-308~+10+308 最小非规格化数 10-324 * * C 语言中的浮点数类型 C语言中浮点数的表示: float:对应IEEE754单精度浮点数格式 double:对应IEEE754双精度浮点数格式 long double:对应IEEE754扩展双精度浮点数格式,但其长度和格式随编译器和处理器的不同而有所不同。 * * 在int、float、double之间进行转换的结果: (以int为32位为例) ⑴ 从int转换为float时,结果不会溢出,但可能有数据被舍入。 ⑵ 从int或float转换为double时,因为double的有效位数更多,故能保留精确值。 ⑶从double转换为float时,因为float的表数范围小,故可能发生溢出。由于float的有效位数少,故可能有数据被舍入。 ⑷从float或double转换为int时,因为int 没有小数,故可能丢失有效数据。因为int的表数范围小,故可能发生溢出。 * * 例:设变量i、f、d的类型分别是int、float、double,它们的取值是除+∞、-∞、NaN以外的任意值。请判断下列每个C语言关系表达式在32位机上运行时是否永真。 ⑴ i==(int)(float) i × ∵int精度比float高,∴当i转换为float再转换为int时,可能丢失有效位数。 ⑵ f==(float)(int) f × ∵float有小数部分,∴当f转换为int 再转换为float时,可能丢失小数部分。 * * ⑶ i==(int)(double) i √ ∵ double比int精度高范围大,∴当i转换为double再转换为int时,数值不变。 ⑷ f==(float)(double) f √ ∵ double比float精度高范围大,∴当f转换为double 再转换为float时,数值不变。 ⑸ d==(float) d × ∵ double比float精度高范围大, ∴当d转换为float时,数值可能改变。 * * ⑹ f==-(-f ) √ ∵ 浮点数取负就是简单地将数符取反。 ⑺ (d+f ) -d==f × ∵ double比float精度高范围大, ∴当d与f进行计算时,有可能因为对阶的原因使f的有效位丢失,而使计算出现误差。 例如当d=1.79×10308,f=1.0时,左边的的计算由于(d+f ) 的对阶,而使f=0,因此结果为0,但右边结果为1。 * * 2.3.3 定点表示与浮点表示的比较 1. 在字长相同的条件下,浮点表示的数据范围大、精度高。 例:对于数据 N,设机器字长为16位,补码表示。当采用定点整数表示时,有1位数符,15位尾数;采用浮点数表示时,有1位数符,1位阶符,3位阶码,11位尾数。 定点整数的表示范围 -215≤N≤-1 和 +1≤N≤215-1 浮点数的表示范围 -1×27≤N≤-2-11×2-8 和 2-11×2-8 ≤N≤(1-2-11)×27 * * 由于浮点数运算中随时对中间结果进行规格化处理,所以减少了有效数字的丢失,提高了运算精度。 2. 浮点运算算法复杂,所需设备量大,运算速度慢。 定点数小数点固定,可以直接运算。而浮点数运算需要进行对阶(对齐小数点)与规格化,既有尾数运算又有阶码运算,算法复杂,因此所需设备量大,线路复杂,运算速度也比定点数运算慢。 数据表示是计算机系统结构设计的重要问题,同时也是算法设计的重要问题。 * * 2.4 非数值型数据的表示 为了处理非数值领域的问题,需要在计算机中引入文字、字母及一些专用符号等,以便表示文字语言、逻辑语言等信息。但由于计算机硬件能够直接识别和处理的只是“0”、“1”二进制信息,因此在计算机中对这类数据必须用二进制代码来表示。 非数值型数据表示:逻辑数、字符、字符串、文字及某些专用符号等的二进制代码。 这些二进制代码并不表示数值,所以称为非数值型数据或符号数据。 * * 2.4.1 逻辑数 —— 二进制串 在计算机中一个逻辑数是用一个二进制串来表示的。逻辑数具有下面几个特点: (1) 逻辑数没有符号的问题。逻辑数中各位之间是相互独立的,既没有位权问题,也没有进位问题。 (2) 逻辑数中的“0”与“1”不代表值的大小,仅代表一个命题的真与假、是与非等逻辑关系。 (3) 逻辑数只能参加逻辑运算,并且是按位进行的。 例2.32 1011+1100=1111 * * 2.4.2 字符与字符串 字符与字符串数据是计算机中用得最多的符号数据,它是人和计算机联系的桥梁。为使计算机硬件能够识别和处理字符,必须对字符按一定规则用二进制编码。 目前广泛使用的是 ASCII码(美国国家信息交换标准字符码)和EBCDIC码(扩展的二 — 十进制交换码)。 * * 1. 字符编码 ASCII码是用七位二进制表示一个字符,它包括10个数字(0~9),52个英文大、小写字母(A~Z,a~z),33个专用字符(如,、%、#等)和33个控制字符(如NUL、LF、CR、DEL等)共128个字符。 ASCII字符编码符号的排列次序为b6b5b4b3b2b1b0,其中b6b5b4为高位部分,b3b2b1b0为低位部分。 * * * * NUL 空 VT 垂直制表 SOH 标题开始 FF 换页 STX 文本起始 CR 回车 ETX 文本结束 SO 移位输出 EOT 传输结束 SI 移位输入 ENQ 询问 SP 空间(空格) ACK 应答(肯定) DLE 数据连接断开 BEL 响铃 DCl 设备控制1 BS 退一格 DC2 设备控制2 HT 水平制表符 DC3 设备控制3 LF 换行 DC4 设备控制4 SYN 空转同步 NAK 反向应答(否定) ETB 信息组传送结束 FS 文件分隔符 CAN 作废 GS 组分隔符 EM 纸尽 RS 记录分隔符 SUB 取代 US 单元分隔符 ESC 中断 DEL 作废 * * 在计算机中,通常用一个字节表示一个字符。由于ASCII编码为七位二进制,字节的最高位的作用: ① 用作奇偶校验位,用来检测错误。 ② 用于表示字符,形成扩展的ASCII码。如EBCDIC码。 EBCDIC(EstendedBinary Coded Decimal Interchange Code)是IBM公司常用的一种字符编码。它采用八位二进制数表示一个字符。 ③ 在我国用于区分汉字和字符。如规定字节的最高位为“0” 表示ASCII码,为“1” 表示汉字编码。 * * 2. 字符串数据 字符串:连续的一串字符。 通常一个字符串占用主存中多个连续的字节进行存放。 字节1 字节2 字节L A+0 A+1 A+L+1 ┇ ┇ * * 2.4.3 汉字信息的表示 为使计算机能够处理各种汉字信息,必须对汉字进行编码。 汉字在计算机中的表示比较特殊。因为在计算机中使用汉字,需要涉及到汉字的输入,存储与处理、汉字的输出等几方面的问题,因此汉字的编码也有多种类型。 汉字输入码 汉字机内码 汉字交换码 汉字字形码 存储处理 键盘输入 交换汉字信息 显示、打印 * * 汉字处理过程 在汉字信息处理系统中,人们使用键盘把汉字以汉字输入码的形式输入到计算机内,将其变换成计算机内部表示的汉字机内码,进行存储和处理。处理结果,如果送往终端设备或其它汉字系统,则把汉字机内码变换成标准汉字交换码,再传送出去。如果把处理结果显示或打印,则把汉字机内码变换成汉字地址码到字库取出汉字字形码送往显示器或打印机。 * * 1. 汉字输入码 汉字输入码:汉字输入操作者使用的汉字编码。 ⑴ 音码:利用汉字的字音属性对汉字的编码。 如:全拼、双拼、智能ABC、紫光拼音输入法等。 特点:易记。但击键次数多,重码多,不能盲打。 ⑵形码:以汉字的笔划和顺序为基础的编码。也称字形编码。 如:五笔字型、郑码等。 特点:便于快速输入和盲打,但要经过训练和记忆。 * * ⑶ 音形结合码:将音码和形码结合起来的编码。 如:声韵笔形码、郑码、自然码等。 ⑷数字码:用固定数目的数字来代表汉字。 如:电报码、区位码。 特点:无重码,输入码与机内码的转换比较方便,但难记忆。 ① 电报码:用4位十进制数字表示一个汉字。 ② 区位码:用数字串代表一个汉字输入。常用的是国标区位码,它是将国家标准局公布的6763个两级汉字分为94个区,每个区分94位,实际上把汉字表示成二维数组,每个汉字在数组中的下标就是区位码。区码和位码各两位十进制数字,因此输入一个汉字需按键四次。例如“中”字位于第54区48位,区位码为5448。 * * 2.汉字交换码 汉字交换码:用于不同汉字系统间交换汉字信息,具有统一的标准。 1981年国家标准总局公布了《信息交换用汉字编码字符集》,即GB2312—80,简称国标码。也称为国标交换码、交换码。 该标准共收集汉字6763个,其中一级汉字3755个,二级汉字3008个,再加上各种图形符号682个,共计7445个。 国标码规定每个汉字、图形符号都用两个字节表示,每个字节只使用最低七位。 * * 国标码是在区位码的基础上规定的。 区位码无法用于汉字通信,因为它可能与通信使用的控制码(00H~1FH)(即0~31)发生冲突。 ISO2022规定每个汉字的区号和位号必须分别加上32(即二进制数00100000),经过这样的处理而得的代码就是国标码。 * * 例: “学”字的区号为49,位号为07,其区位码为4907,用2个字节的二进制数表示为: 00110001 00000111 “学”字的国标码计算为: 00110001?? 00000111 +00100000 +00100000 01010001?? 00100111 用十六进制数表示为5127H。 * * 3. 汉字机内码 汉字机内码:用于汉字信息的存储、检索等操作的机内代码,一般采用两个字节表示。 英文字符的机内代码是七位的ASCII码,当用一个字节表示时,最高位为“0”。 为了与英文字符能相互区别,目前我国的计算机系统中汉字内码都是以国标码为基础,在国标码基础上把每个字节的最高位置“1”,作为汉字标识符。即机内码=国标码+8080H 有些系统中,字节的最高位作为奇偶校验位,在这种情况下就用三个字节表示汉字内码。 * * 比例因子的选择与溢出 在定点运算中,参加运算的数据必须是定点小数或定点整数。因此在运算之前,必须选择一个恰当的比例因子,将所有参加运算的数均化成纯小数或纯整数,然后再进行运算。运算结果再根据所选的比例因子转换成正确的值。 比例因子必须选择恰当。选择太大,将会影响运算精度;选择太小,会使运算结果超出机器所能表示的数据范围,即出现溢出。 溢出:运算结果超出机器所能表示的数据范围。 * * 例2.24 在定点小数机器中计算 11.01+10.01 选择比例因子 2-2=0.01,可将两操作数变换为 0.1101+0.1001 但 0.1101+0.1001=1.0110,运算结果不是纯小数,出现了机器数不能表示的数,即出现了正溢出。 如果选择比例因子 2-3=0.001,可将两操作数变换为 0.01101+0.01001 则运算结果 0.01101+0.01001=0.10110 为正常结果。将0.10110除以比例因子 2-3,可得到正确结果 101.10 * * 一旦出现溢出,机器将无法正确表示和处理,所以机器在运算过程中必须及时地识别和处理溢出。 比例因子的选择,早期是由用户自己进行的。在现代的计算机中,比例因子的选择是由系统程序(如编译程序)完成的,对用户往往是透明的。 * * 定点机的数据存储单元的利用率往往很低。 例如在采用定点小数的机器中,必须把所有参加运算的数据至少都除以这些数据中的最大数,才能把所有数据都化成纯小数,但这样可能会造成很多数据出现大量的前置0,从而浪费了许多存储单元。 * * 结论: 定点表示计算简单,硬件实现容易。但数据表示范围小,比例因子选择困难,很难兼顾数值范围和精度的要求,不适合科学计算。 怎么办? * * 2.3.2 浮点表示 浮点表示:是指各个数的小数点位置不是固定不变的,而是可以浮动的。 即 (N)R=S×Re 中的 e 值是可变的。 由于 e 的取值可变,因此在机器中必须将 e 表示出来。 * * 1. 浮点表示的数据格式 浮点数由阶码和尾数两部分组成。 阶码:表示数的小数点实际位置。 尾数:表示数的有效数字。 尾数的基数R是设计者约定的,用隐含方法表示。通常取 R=2,也可以采用4、8、16进制。 阶码均采用2为基数。 浮点数的表示格式中,包括1位数符、用 n 位纯小数表示的尾数部分、1位阶符和用 m 位纯整数表示的阶码部分。 数符 阶符 阶码 尾数 1位 1位 m位 n位 * * 浮点数的两种表示格式 在实际机器中,通常都采用后一种表示格式。 * * 2. 浮点数的规格化表示 数据采用浮点表示时,存在两个问题: ⑴ 如何尽可能多地保留有效数字; ⑵ 如何保证浮点表示的唯一。 例2.25 0.001001×25有多种表示: 0.001001×25=0.100100×23=0.00001001×27 所以在浮点表示下的代码不唯一。 若规定尾数的位数为6位,则采用0.00001001×27就变成了0.000010×27,丢掉了有效数字,减少了精度。因此为了尽可能多地保留有效数字,应采用0.100100×23的表示形式。 * * 浮点数采用规格化表示方法的目的: ⑴ 提高运算精度,充分利用尾数的有效数位,尽可能占满位数,以保留更多的有效数字。 ⑵ 保证浮点数表示的唯一性。 例2.26 0.100100×23=0.001001×25 为达到上述目的,需要尽可能去掉尾数中的前置“0” 。即尽量使小数点后第一位为“1”。 对于二进制数,就是要满足 * * 3. 规格化数的定义 原码表示的规格化数 若[S]原=Sf.S1S2…Sn,则满足 的数为规格化数。 对于[S]原=Sf.S1S2…Sn,其规格化标志是: S1 =1 即:[S]原=0.1xx…x 或 [S]原=1.1xx…x 例2.27 [S]原=0.1101101、[S]原=1.1101101 是规格化数 [S]原=0.0101101、[S]原=1.0101101 不是规格化数 * * 补码表示的规格化数 若[S]补=Sf.S1S2…Sn,则满足 和 的数为规格化数。 对于[S]补=Sf.S1S2…Sn,其规格化标志是: Sf⊕S1=1 即:[S]补=0.1xx…x 或 [S]补=1.0xx…x * * 注意:补码表示的规格化数中, 不是规格化数,而-1是规格化数。 因为 =-0.1,写成补码为1.1,不符合规格化规定,所以 不是规格化数。 -1的补码是1.000,符合规格化规定,所以-1是规格化数。 例2.28 [S]补=0.1101101、[S]补=1.0101101 是规格化数 [S]补=0.0101101、[S]补=1.1101101 不是规格化数 * * 3.浮点数的表示范围 要求浮点数的表示范围,实质是求出浮点数所能表示的最小负数、最大负数,最小正数和最大正数这四个典型数据。 * * 浮点数能正确表达的数: 处于0以及处于最大负数到最小负数(负数区)之间、最小正数到最大正数(正数区)之间的数。 机器零:处于最大负数和最小正数(下溢区)的浮点数,由于其绝对值小于可表示的数值,在计算机中通常作为“0”来处理,称为机器零。 正溢出:数据大于最大正数。 负溢出:数据小于最小负数。 如果数据的绝对值大于机器所能表示的数值,计算机将做溢出处理。 * * 设浮点数的格式为: 数符 阶符 阶码 尾数 1位 1位 m位 n位 * * 阶码和尾数均用原码表示时的浮点数表示范围 数符 阶符 阶码 (m位) 尾数 (n位) 真 值 非规格化 最小正数 0 1 11…11 00…01 规格化 最小正数 0 1 11…11 10…00 最大正数 0 0 11…11 11…11 非规格化 最大负数 1 1 11…11 00…01 规格化 最大负数 1 1 11…11 10…00 最小负数 1 0 11…11 11…11 * * 阶码和尾数均用补码表示时的浮点数表示范围 数符 阶符 阶码 (m位) 尾数 (n位) 真 值 非规格化 最小正数 0 1 00…00 00…01 规格化 最小正数 0 1 00…00 10…00 最大正数 0 0 11…11 11…11 非规格化 最大负数 1 1 00…00 11…11 规格化 最大负数 1 1 00…00 01…11 最小负数 1 0 11…11 00…00 * * 阶码用移码,尾数用补码表示时的浮点数表示范围 数符 阶符 阶码 (m位) 尾数 (n位) 真 值 非规格化 最小正数 0 0 00…00 00…01 规格化 最小正数 0 0 00…00 10…00 最大正数 0 1 11…11 11…11 非规格化 最大负数 1 0 00…00 11…11 规格化 最大负数 1 0 00…00 01…11 最小负数 1 1 11…11 00…00 * * 4. 浮点表示中阶码与尾数位数的选择 在浮点数表示中 尾数的位数决定了数据表示的精度。增加尾数的位数可增加有效数字位数,即提高数据表示精度。 阶码的位数决定了数据表示的范围。增加阶码的位数,可扩大数据表示的范围。 因此当字长一定的条件下,必须合理地分配阶码和尾数的位数,以满足应用的需要。 * * 为了得到较高的精度和较大的数据表示范围,在很多机器中都设置单精度浮点数和双精度浮点数等不同的浮点数格式。 单精度浮点数就是用一个字长表示一个浮点数。 双精度浮点数是用二个字长表示一个浮点数。 * * 例2.29 32位的VAX-11机的浮点数格式 单精度浮点数—— F浮点 双精度浮点数—— D浮点 数符 阶码 尾数 1位 8位 23位 数符 阶码 尾数 1位 8位 55位 32位 64位 * * G浮点 H浮点 数符 阶码 尾数 1位 11位 52位 数符 阶码 尾数 1位 15位 112位 64位 128位 * * 5. 浮点数的机器零问题 浮点数的机器零: ⑴ 如果一个浮点数的尾数为全0,则不论其阶码为何值; ⑵ 如果一个浮点数的阶码小于它所能表示的最小数,则不论其尾数为何值; 计算机在处理时都把这种浮点数当作“0”看待,称为机器零。 * * (1) 尾数S=0,浮点数N=S×Re, 对所有e值,有N=0×Re=0 (2) 当E<-2n,无论S等于多少,数据N都小于机器所能表示的最小数, 即出现浮点数下溢,机器通常用N=0 来处理,即当作机器零。 机器零 * * 浮点数的阶码采用移码表示时的机器零 当浮点数的阶码采用移码表示、尾数采用补码表示时,如果阶码为它所能表示的最小数-2m(m为阶码的位数)且尾数为0时,其阶码的表现形式全为0,尾数的表现形式也为全0,这时机器零的表现形式为000…00。这种全0表示,有利于简化机器中的判“0”电路。 * * 例:阶码用移码,尾数用补码表示 非规格化最小正数:0 0 00…00 00…01 规格化最小正数: 0 0 00…00 10…00 比上述数据小的数都将被视为机器零。 * * 7. IEEE754 浮点数标准 二进制浮点数的表示,由于不同机器所选用的基值、尾数位长度和阶码位长度不同,因此对浮点数表示有较大差别,这就不利于软件在不同计算机间的移植。 美国IEEE(电气及电子工程师协会)为此提出了一个从系统结构角度支持浮点数的表示方法,称为IEEE标准754(IEEE,1985),当今流行的计算机几乎都采用了这一标准。 * * IEEE 754标准在表示浮点数时,每个浮点数均由三部分组成:符号位S,指数部分E和尾数部分M。 浮点数可采用以下四种基本格式: (1)单精度格式(32位):E=8位,M=23位。 (2)扩展单精度格式:E≥11位,M=31位。 (3)双精度格式(64位):E=11位,M=52位。 (4)扩展双精度格式:E≥15位,M≥63位。 S E M 数符 指数 尾数 * * IEEE754单精度浮点数格式 目前广泛采用的IEEE754浮点数据编码标准中,32位单精度浮点数表示格式为: 在IEEE 754标准中由32位单精度所表示的浮点数 N 的数值为: 1位 8位 23位 S E M 数符 指数 尾数 * * S:数符,0 表示“+”,1 表示“-”。 E:指数即阶码部分。其中包括1位阶符和7位数值。采用移127码,移码值为127。即 阶码=127+实际指数值 规定阶码的取值范围为1~254,阶码值255和0,用于表示特殊数值。 M:共23位。由于尾数采用规格化表示,所以IEEE754标准约定在小数点左部有一位隐含位为1,从而使尾数的实际有效位为24位,即尾数的有效值为1.M。 * * IEEE 754标准32位单精度浮点数N的解释如下: 若E=0,且M=0,则 N为0。 若E=0,且M≠0,则 N=(-1)S·2-126·(0.M)。为非规格化数。 若1≤E≤254,则 N=(-1)S·2E-127·(1.M)。为规格化数。 若E=255,且M≠0,则 N=NaN (“非数值”)。 若E=255,且M=0,则 N=(-1)S∞ (无穷大)。 * * 2.2.5 移码表示 移码也称为增码、余码。在计算机中,移码主要用于表示浮点数的阶码。 1. 移码的定义 纯小数移码的定义 [x]移=1+x -1≤x<1 纯整数移码的定义 [x]移=2n+x -2n≤x<2n n为除符号外的数值位数 由于移码通常用于表示浮点数的阶码。所以主要考虑整数的移码表示。 * * 例2.20 在字长为8位的机器中,[x]移=27+x 设 x=+1100101 则 [x]移=27+1100101=10000000+1100101 =11100101 设 x=-1100101 则 [x]移=27-1100101=10000000-1100101 =00011011 * * 移码的几何性质 当n=3时,纯整数的移码为: 线 -010(-2) 0110 +010(+2) 1010 -011(-3) 0101 +011(+3) 1011 -100(-4) 0100 +100(+4) 1100 -101(-5) 0011 +101(+5) 1101 -110(-6) 0010 +110(+6) 1110 -111(-7) 0001 +111(+7) 1111 -1000(-8) 0000 * * 0 1 2 3 4 5 6 7 -1 -2 -3 -4 -5 -6 -7 -8 0000 0010 0100 1000 1010 1100 1110 0110 0001 0011 0101 1001 1011 1101 1111 0111 移码的几何性质 真值 移码 * * 移码表示的实质是把真值映像到一个正数域,因此移码的大小可直观地反映真值的大小。 不管正数还是负数,用移码表示时,都可以按无符号数比较大小。 * * 2. 移码中“0”的表示 移码中“0”的表示是唯一的 [+0]移=[-0]移=10…0 (纯整数) 移码的表数范围与补码一致 纯整数移码表示的最小数可以表示到-2n * * 3. 移码与补码的关系 整数补码的数值部分不变,符号取反,即得整数移码。反之亦然。即: x≥0时 [x]移=[x]补+2n x<0时 [x]移=[x]补-2n * * 4. 移码的特点 ⑴ 设[x]移=x0x1x2 … xn,符号位x0表示线,x为负。 ⑵ 线的移码表示只有一种形式。 ⑶ 移码与补码的表示范围相同。 纯小数的移码可以表示到“-1”, [-1]移=0.0…0; 纯整数的移码可以表示到“-2n”, [-2n]移=00…0 , n为数值部分的长度。 * * ⑷ 真值大时,对应的移码也大; 真值小时,对应的移码也小。 当[x]移= 0时,x为编码所能够表示的最小值。 * * 5. 特殊的移码 根据移码的几何性质,可以将移码的定义进行扩展,得到特殊的移码为: 移码=K+实际数值 K:约定的移数值 例:移127码,移数值为127,即: 移127码=127+实际数值 * * 例2.21 求+12和-3的8位移127码的二进制编码形式。 解: (+12)10=1100, [+12]移127码=127+12=(139)10 =(1111111+1100)2 =(10001011)2 (-3)10=11, [-3]移127码=127-3=(124)10 =(1111111-11)2 =(01111100)2 * * 不同码制之间的转换 * * 例2.22 设某计算机的字长为8位,采用整数表示。求表中机器数在不同表示形式中对应的十进制真值。 表示方法 机器数 原码 补码 反码 移码 无符号数 01001001 10101101 11111111 +73 -45 -127 +73 -83 -1 +73 -82 -0 -55 +45 +127 73 173 255 * * C语言中的整数类型 C语言中的无符号整数的表示: Unsigned short、Unsigned int(Unsigned) Unsigned long等 C语言中带符号整数采用补码表示: Short、int、long等 常在数据的后面加一个“u”或“U”来表示无符号数。 例:12345U、0x5B6Fu * * C语言中允许无符号整数与带符号整数之间的转换,转换后的数的真值是将原二进制机器数按转换后的数据类型重新解释得到。 例:在32位机中,有以下C代码: 1 int x=-1 2 Unsigned u=2147483648 (即231) 3 4 printf(“x=%u=%d\n, x,x) 5 printf(“u=%u=%d\n, u,u) 输出结果: x=4294967295=-1 u=2147483648=-2147483648 * * x的输出结果中 -1的补码整数表示为“111???1” 通过%d作为带符号数解释时,其值为“-1” 通过%u作为无符号数解释时,在32位机中其值为:232-1= 4294967295 u的输出结果中 231的无符号整数表示为“100???0” 通过%u作为无符号数解释时,其值为231 “2147483648” 通过%d作为带符号数解释时,其值为 “-2147483648 ” * * C语言中,如果在执行一个运算中有带符号整数与无符号数同时参加,则C编译器会隐含地将带符号整数强制类型转换为无符号数,因而会带来意想不到的结果。 例:以下无符号运算的结果与直觉不符 -2147483648== 2147483648U 结果为√ ∵ 无符号运算中 100???0B=100???0B -2147483648< 2147483647U 结果为× ∵ 无符号运算中 100???0B ( 232)>011???1B ( 232-1) * * 2.3 数的定点表示与浮点表示 任何一个数均可表示为: (N)R=S×Re R:基值。计算机中常用的R可取2、8、16等。 S:尾数。代表数N的有效数字。计算机中一般表示为纯小数。 e:阶码。代表数N的小数点的实际位置。一般表示为纯整数。 例2.23 (123.45)10=12345×10-2=0.12345×103 (11011.101)2=0.11011101×25=0.11011101×2101 =11011101×2-3=11011101×2-11 * * 2.3.1 定点表示 定点表示:约定计算机中所有数据的小数点位置均是相同的而且是固定不变的。 定点表示是一种阶码e的取值固定不变的机器数表示。 当采用定点表示时,(N)R=S×Re 中e的取值固定不变。 定点数有两种表示方法:定点小数和定点整数。 机器确定后,e就确定了,不能更改,也不能两者并存。 * * 1. 定点小数 e=0,表示纯小数,约定小数点在符号位与最高数值位之间。 定点小数的格式 数符 尾数 x0 x1 x2 …… xn 小数点 * * 2. 定点整数 e=n,表示纯整数,约定小数点在最低有效数值位之后。 定点整数的格式 数符 尾数 x0 x1 x2 …… xn 小数点 * * 3. 定点数的表示范围 设数据为N,机器字长为n+1,其中1位符号位,n位数值位。在不同的表示方法下,所能表示的数的范围不同。 ⑴ 原码表示 二进制定点小数的表示范围为: 0≤︱N︱≤1-2-n 二进制定点整数的表示范围为: 0≤︱N︱≤ 2n-1 * * 机器数 真 值 数符 尾数(n位) 定点小数 定点整数 最小正数 0 00 … 01 +2-n +1 最大正数 0 11 … 11 1-2-n 2n-1 最大负数 1 00 … 01 -2-n -1 最小负数 1 11 … 11 -(1-2-n) -(2n-1) 定点原码数的表示范围 * * ⑵ 反码表示 定点反码数的表示范围与定点原码数的表示范围相同。定点反码表示的表示范围为: 机器数 真 值 数符 尾数(n位) 定点小数 定点整数 最小正数 0 00 … 01 +2-n +1 最大正数 0 11 … 11 1-2-n 2n-1 最大负数 1 11 … 10 -2-n -1 最小负数 1 00 … 00 -(1-2-n) -(2n-1) * * ⑶ 补码表示 二进制定点小数的表示范围为: -1≤N≤1-2-n 二进制定点整数的表示范围为: -2n≤N≤ 2n-1 * * 定点补码数的表示范围 机器数 真 值 数符 尾数(n位) 定点小数 定点整数 最小正数 0 00 … 01 +2-n +1 最大正数 0 11 … 11 1-2-n 2n-1 最大负数 1 11 … 11 -2-n -1 最小负数 1 00 … 00 -1 -2n * * ⑷ 移码表示 定点移码数的表示范围与定点补码码数的表示范围相同。其表示范围为: 机器数 真 值 数符 尾数(n位) 定点小数 定点整数 最小正数 1 00 … 01 +2-n +1 最大正数 1 11 … 11 1-2-n 2n-1 最大负数 0 11 … 11 -2-n -1 最小负数 0 00 … 00 -1 -2n * * 在补码和移码表示范围中,最小负数比原码和反码表示范围大一个数,定点小数为“-1”,定点整数为“-2n”。 以定点整数为例,原码和补码表示范围的数轴表示形式为: 0 +1 2n-1 -1 -(2n-1) 11…11 10…00 00…00 10…01 00…01 01…11 原码 0 +1 2n-1 -1 -(2n-1) 10…01 00…00 11…11 00…01 01…11 补码 -2n 10…00 * * 从数轴中可见,最大负数到最小负数,最小正数到最大正数之间以及 0,为机器数所能表达的数。 0 最小负数 负数区 机器零 上溢区 下溢区 正数区 上溢区 最大负数 最小正数 最大正数 * * 机器零:小于机器数最小正数,大于机器数最大负数的数。 正溢出:大于机器数最大正数的数。 负溢出:小于机器数最小负数的数。 因为正溢出和负溢出都表示数的绝对值超出了机器数所能表示的最大绝对值,所以称这类数处于上溢区。 因为属于机器零的数均小于机器数所能表示的最小绝对值,所以称这类数处于下溢区。 * * 3. 定点数的分辨率 定点数在数轴上的分布是不连续的,定点数的分辨率是指相邻两个定点数之间的最小间隔。 字长为n+1的定点小数的分辨率为2-n; 字长为n+1的定点整数的分辨率为1。 * * 4. 定点机的特点 硬件上只考虑定点小数或定点整数运算的计算机称为定点机。 定点机的优点:运算简单,硬件结构比较简单。 定点机存在的问题: ⑴ 所能表示的数据范围小。 ⑵ 使用不方便,运算精度较低 。 ⑶ 存储单元利用率低。 * * 例2.9 设机器字长为8位,写出+37和-37的二进制原码,并用十六进制表示。 解: (+37)10=(100101)2 =(00100101)2 [00100101]原=00100101=25H (-37)10=(-100101)2 =(-00100101)2 [-00100101]原=10100101=A5H 可见将[x]原的符号取反即可得到[-x]原 * * 2. 原码中 0 的表示 原码中“0”有两种表示 纯小数原码 [+0]原=0.00…0 [-0]原=1.00…0 纯整数原码 [+0]原=00…0 [-0]原=10…0 * * 对于纯小数,n+1位原码的表示范围: -0.111…11~+0.111…11 n位 n位 即-(1-2-n) ~ (1-2-n) 纯小数n+1位原码中有一位是符号 对于纯整数,n+1位原码的表示范围: -111…11~+111…11 n位 n位 即-(2n-1) ~ (2n-1) 纯整数n+1位原码中有一位是符号 3. 原码的表数范围 * * 因为原码中“0”有两种表示方式, 所以 n+1 位的原码共可表示 2n+1-1 个数 * * 4. 原码的移位规则 符号位不变,数值部分左移或右移,移出的空位填“0”。 例: [0.0110000]原= 0.0110000 [0.0110000]原=0.0011000 2×[0.0110000]原=0.1100000 注意 左移时不要将有效位移出,否则将会出错。 * * 5. 原码的特点 ⑴ 原码表示直观、易懂,与真值的转换容易。 ⑵ 原码表示中0有两种不同的表示形式,给使用带来了不便。 通常0的原码用[+0]原表示,若在计算过程中出现了[-0]原,则需要用硬件将[-0]原变为[+0]原。 ⑶ 原码表示的加减运算复杂。 * * 利用原码进行两数相加运算时,首先要判别两数符号,若同号则做加法,若异号则做减法。 在利用原码进行两数相减运算时,不仅要判别两数符号,使得同号相减,异号相加;还要判别两数绝对值的大小,用绝对值大的数减去绝对值小的数,取绝对值大的数符号为结果的符号。 可见原码表示不便于实现加减运算。 * * 2.2.3 补码表示 引入补码的目的是为了解决原码表示在加减运算时的不便。 1. 模的概念 根据运算时“模”的概念 5-2=5+8=3 (Mod 10) 对于某一确定的模,某数减去一个数,可以用加上那个数的负数的补数来代替。 * * [x]补=M+x (Mod M) 当x≥0时,M+x 大于M,把M丢掉,所以 [x]补=x ,即正数的补数等于其本身。 当x<0时,[x]补=M+x=M-x,所以负数的补数等于模与该数绝对值之差。 * * 2. 补码的定义 在计算机中,由于数据是用二进制编码表示的,所以把补数称为补码。 对于纯小数表示,通常取模 M=2 对于纯整数表示,通常取模 M=2n+1 (n为除符号位以外数值位的位数) * * 纯小数的补码定义 纯整数的补码定义 * * 例2.10 x=+0.1011 [x]补=0.1011 例2.11 x=-0.1011 [x]补=2+x=10.0000-0.1011=1.0101 例2.12 x=+1011 [x]补=01011 例2.13 x=-1011, [x]补=25+x=100000-1011=10101 * * 补码中“0”的表示是唯一的 [+0]补=[-0]补=0.00…0 (纯小数) [+0]补=[-0]补=00…0 (纯整数) 3. 特殊数的补码表示 补码表示的最小数可以表示到-1或-2n 对于纯小数 [-1]补=2+(-1)=1.00…0 (Mod 2) 对于纯整数 [-2n]补=2n+1+(-2n)=100…0 (Mod 2n+1) * * 因为补码可以表示-1(纯小数)和-2n(纯整数),所以补码的表数范围比原码大。 [-1]补=1.00…0 [-2n]补=100…0 对于-1和-2n的补码,符号位上的 1 具有特殊意义,既表示符号也表示数值。 补码中每一种编码都有独立的意义。 对于n+1位补码,其表数范围为: 纯小数 -1~1-2-n 共2n+1个数 纯整数 -2-n~2n-1 共2n+1个数 结论 * * 4. 补码的简便求法 若x≥0,则[x]补=x,符号位为0 若x<0,则将x的各位取反,然后在最低位上加1,符号位等于1,即得到[x]补。 例2.14 若 x=+0.1011001,则[x]补=0.1011001 若 x=-0.1011001 则 [x]补=1.0100110+0.0000001=1.0100111 若 x=+1101010 则[x]补=01101010 若 x=-1101010 则[x]补=10010110 * * 5. 补码的几何性质 当n=3时,纯整数的补码为: * * * * ① 正数的补码就是其本身,负数的补码表示的实质是把负数映像到正值区域,因此加上一个负数或减去一个正数可以用加上另一个数(补码)来代替。 ② 从表示符号的角度看,符号位的值代表了数的正确符号,0表示正数,1表示负数。从映像值来看,符号位的值是映像值的一个数位,因此在补码运算中,符号位与数值位一样参加运算。 补码的几何性质说明了补码运算的基础。 补码的几何性质 原码运算时符号位不能参加运算。 注意 * * 5.补码的几个关系 1) 补码与原码的关系 若 x≥0,则[x]补=[x]原 若 x<0,则将除符号位以外的[x]原各位取反(符号位不变),然后在最低位上加1,即得到[x]补。反之,将除符号位以外的[x]补的各位取反(符号位不变),然后在最低位上加1,即得到[x]原。 补殊数-1(纯小数)和-2n(纯整数)的表示,在原码中没有对应表示。 注意 * * 例2.15 ⑴ x=+0.1001100 [x]原=0.1001100 [x]补=0.1001100 ⑵ x=-0.1001100 [x]原=1.1001100 [x]补=1.0110100 ⑶ x=+1001100 [x]原=01001100 [x]补=01001100 ⑷ x=-1001100 [x]原=11001100 [x]补=10110100 * * 2) 补码与机器负数的关系 在补码运算中称 [x]补为机器正数, [-x]补为机器负数。 已知[x]补,求机器负数的方法: 将[x]补的各位(含符号位)取反,然后在最低位上加1,即可得到[-x]补。反之亦然。 求[-x]补,也称为对[x]补的求补。 * * 例2.16 [x]补=1.0011010 [-x]补=0.1100110 [x]补=10110010 [-x]补=01001110 简单求补方法:在取反过程中,低位最后一个1不变,最后一个1后的0也都不变。 * * 3) 补码的移位规则 补码数右移规则: 符号位不变,数值位各位向右移位,高位移空位置补与符号位相同的代码。 补码的左移规则: 连同符号位同时左移,低位移空位置补0。如果移位后符号位与移位前符号位不一致,说明移位出错,将有效位移出了。 * * 例2.17 [x]补=1.0011010 [ x]补=1.1001101 [x]补=0.0110010 [ x]补=0.0011001 [x]补=10110010 [ x]补=11011001 [x]补=1.1111010 [2x]补=1.1110100 [x]补=10110010 [2x]补=01100100 出错! * * 6. 补码的模 补码总是对确定的模而言的。如果补码运算结果超过了模,则模将自动丢失。 补码运算在运算过程中,模不能改变。 因为整数补码的模不同,所以不能将不同位数的补码直接进行运算。如需进行运算,需要进行符号扩展。 例2.18 [x]补+[y]补=0110+1101= 1 0011=0011 [x]补+[y]补=11010111+1011 =11010111+11111011 = 1 11010010=11010010 * * 7. 补码的特点 ⑴ 在补码表示中,用符号位x0表示数值的正负,形式与原码表示相同,即0正1负。但补码的符号可以看作是数值的一部分参加运算。 ⑵ 在补码表示中,数值“0”只有一种表示方法,即00…0。 ⑶ 负数补码的表示范围比负数原码的表示范围略宽。纯小数的补码可以表示到“-1”,纯整数的补码可以表示到“-2n”。 由于补码表示中的符号位可以与数值位一起参加运算,并且可以将减法转换为加法进行运算,简化了运算过程,因此计算机中均采用补码进行加减运算。 * * 2.2.4 反码表示 反码实质上是补码的一个特例,其特别之处在于反码的模比补码的模小一个最低位上的 1。 1. 反码的定义 纯小数反码的定义(n为小数点后的数值位数) 纯整数反码的定义 (n为除符号外的数值位数) * * 2. 反码的求法 若x≥0 则[x]反=x,符号位为0 若x<0,则将x的各位取反,符号位等于1,即得到[x]反。 例2.19 x=+0.1001100 则[x]反=0.1001100 x=-0.1001100 则[x]反=1.0110011 x=+1001100 则[x]反=01001100 x=-1001100 则[x]反=10110011 * * 3. 反码中“0”的表示 反码中“0”有两种表示 纯小数反码 [+0]反=0.00…0 [-0]反=1.11…1 纯整数反码 [+0]反=00…0 [-0]反=11…1 * * 4. 反码的表数范围 反码的表数范围

http://allpennsylvania.com/suanshushangyi/45.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有