资源简介 (共137张PPT)第2章 计算机中数据的表示2.1 进位计数制及其相互转换2.2 定点数的表示2.3 浮点数的表示2.4 非数值数据的表示2.5 数据校验码关联习题2.1 进位计数制及其相互转换2.1.1 进位计数制 进位计数制是一种按进位进行计数的制式。在日常工作与生活中,我们习惯使用十进制数,而计算机内部只能识别二进制数,但在程序设计时,数据往往用十进制数或十六进制数表示,而很少用二进制数,因为用二进制数表示数据或地址时,位数太长,书写不方便,易出错。 进位计数制具有以下两方面特征: ● 基数R(Radix):是指进制数中数码所允许取值的个数,且计数规则是“逢R进一”。 ● 位权W(Weight):是指基数R的i次幂(Ri),表示进制数中第i位的位权。 1.十进制数(Decimal) 十进制数是我们日常工作生活中最常用的数,数中的任一数码di{0,1,2,…,9},因此十进制数的基数为10,且逢十进一;十进制数的位权为10i。任何一个十进制数都可以按下式写成一个按权展开的多项式和的形式:D=dndn-1…d1d0.d-1…d-m=dn×10n+dn-1×10n-1+…+d1×101+d0×100+d-1×10-1 +…+d-m×10-m = di×10i (2-1)十进制数的后缀为D,可省略。如78D、179.26D可写做78、179.26。 2.二进制数(Binary) 二进制数中的任一数码bi{0,1},因此二进制数的基数为2,且逢二进一;二进制数的位权为2i。任何一个二进制数都可以按下式写成一个按权展开的多项式和的形式:B= bnbn-1…b1b0.b-1…b-m=bn×2n+bn-1×2n-1+…+b1×21+b0×20+b-1×2-1+… +b-m×2-m +… +b-m ×2-m= bi×2i (2-2)二进制数的后缀为B,如1001B、10011101.1101B。 3.十六进制数(Hexadecimal) 十六进制数中的任一数码hi{0,1,2,…,9,A,B,C,D,E,F},因此十六进制数的基数为16,且逢十六进一;十六进制数的位权为16i。 任何一个十六进制数都可以按下式写成一个按权展开的多项式和的形式: H = hnhn-1 …h1h0.h-1…h-m = hn × 16n + hn-1 × 16n-1 + … + h1×161+h0×160+h-1×16-1+… +h-m×16-m = hi×16i (2-3) 十六进制数的后缀为H,如23AH、9C78.1B3H等,A~F相当于十进制数的10~15。为了区分十六进制数和标识符(标号、变量等),当十六进制数首位为A~F时,其前必须加“0”,如0F08H、0C57.2H。2.1.2 进位计数制的相互转换 1.二进制数与十进制数的转换 (1) 二进制数转换为十进制数。直接按式(2-1)展开并求和即可。 【例2-1】 将101110.101B转换为十进制数。 解:101110.101B= 1×25+0×24 +1×23+1×22+1×21+0×20+1×2-1+0×2-2+1×2-3 = 46.625 (2) 十进制数转换为二进制数。十进制数转换为二进制数的方法有两种:直接法和查表法。 直接法:对于整数部分采用“除2取余法”,直到商为零,而余数(由低位到高位)即为转换成的二进制数整数部分;对于小数部分采用“乘2取整法”,而积的整数部分(由高位到低位)即为转换成的二进制数小数部分。最后将转换结果合起来便得到相应的二进制数。【例2-2】 将25.696D转换为二进制数。解:对整数部分,采用“除2取余法”,计算如下:因此 25D = 11001B 对于小数部分,采用“乘2取整法”,计算如下:因此 0.696D≈0.10110B所以 25.696D≈11001.10110B 查表法:利用十进制与二进制数对照表,把十进制数分解成2i多项式和的形式,然后查表求得对应的二进制数。十进制转换为二进制数对应关系如表2-1所示。表2-1 十进制数与2的整次幂之间的对应关系 具体方法:把十进制数(整数和小数)分解成2的整次幂项的和,对于出现2的整次幂项相应的位置数码取“1”,否则取“0”。 【例2-3】 将133.625D转换为二进制数。 解:133.625D = 128+4+1+0.5+0.125 =27+22+20+2-1+2-3 =10000101.101B 2.二进制数与十六进制数之间的转换 由于四位二进制数的编码与一位十六进制数的数码之间存在着一一对应的关系,如表2-2所示,因此,二进制数与十六进制数之间的转换十分简单、方便。表2-2 二进制数与十六进制数之间的对应关系 (1) 二进制数转换为十六进制数。以小数点为分界线,分别向左、向右按四位进行分组,不足四位者,在最前面或最后面补0,使之成为四位,然后,每四位按表2-2的对应关系用一位十六进制数来表示。 【例2-4】 将1111000111.10011B、110110001101B分别转换为十六进制数。 解:1111000111.10011B = 0011 1100 0111.1001 1000B = 3C7.98H 110110001101B = 1101 1000 1101B = D8DH (2) 十六进制数转换为二进制数。每一位十六进制数按表2-2的对应关系转换成四位的二进制数即可,小数点位置不变。 【例2-5】 将3F.75H转换为二进制数。 解:3F.75H = 0011 1111.0111 0101B = 111111.01110101B 3.十进制数与十六进制数之间的转换 (1) 十六进制数转换为十进制数。直接按式(2-3)展开并求和即可。 【例2-6】 将7B9.62H转换为十进制数。 解:7B9.3CH=7×162+11×161+9×160+3×16-1+12×16-2 =1977.234375D (2) 十进制数转换为十六进制数。采用类似十进制数转换为二进制数的方法,对于整数部分采用“除16取余法”,直到商为零,而余数(由低位到高位)即为转换成的十六进制数整数部分;对于小数部分采用“乘16取整法”,而积的整数部分(由高位到低位)即为转换成的十六进制数小数部分。最后将转换结果合起来便得到相应的十六进制数。这种方法因乘、除16比较复杂,一般采用下面的间接方法。 【例2-7】 将105.75D转换为十六进制数。 解:105.75D=1101001.11B=01101001.1100B = 69.CH2.2 定点数的表示2.2.1 符号的表示 计算机本身无法识别数据的符号,即正号(+)和负号(-),为了让计算机能够识别数的符号,必须用“0”和“1”来表示。因此规定:数据字的最高位为符号位,并且用“0”表示正(+),用“1”表示负(-)。于是一个数据字的书写形式和机器内的存储形式存在差异,为了区别这种不同,我们把书写形式(正、负符号加绝对值)的数据称为真值,机器内的存储形式(符号位加二进制数值)的数据称为机器数。 一个数据的机器数究竟采用多少位表示,与机器的字长有关,若机器的字长是16位,则表示数据的机器数也是16位。机器数有一定的长度限制,故相应的真值便会存在一定的范围要求,以8位机为例,8位的机器数相应的真值范围为-128~+127。2.2.2 小数点的表示 数据中的小数点在计算机中有两种表示方法,即定点表示法和浮点表示法。 1.定点表示法 定点表示法所表示的数据为定点数。定点数指小数点在数中的位置是固定不变的。因此,计算机中数的小数点不用表示,或者隐含表示,它不占用存储空间。下面以16位机为例来说明定点表示法。 1) 定点整数 小数点被固定在数值位的最低有效位之后,其格式如下: 2) 定点小数 小数点被固定在符号位与尾数之间,其格式如下: 定点整数表示的数只能是整数,而定点小数所表示的数只能是小数。在本书中,我们更侧重于定点小数。 2.浮点表示法 定点表示法难以表示数值很大或很小的数据,为了表示更大范围的数据,数学上通常采用科学计数法,即将数据表示成三部分:第一部分表示数据的符号;第二部分表示数据的有效值;第三部分表示数据中的小数点位置。改变了第三部分的数值,相当于改变了小数点的位置,这种表示小数点的方法称为浮点表示法。浮点表示法所表示的数据是浮点数,浮点数x通常表示为x = (-1)S M × Re其中:S(Sign)——符号,0表示正(+),1表示负(-); M(Mantissa)——尾数,为定点小数,表示浮点数x的有效数字,决定浮点数的精度; e(exponent)——阶码,为定点整数,表示浮点数x中小数点的实际位置,是影响浮点数大小的主要因素,即它决定了浮点数的表示范围; R(Radix)——基数,是一个系统中约定的常数,通常取值为2。 由于R是一个常数,所以浮点数在计算机中的存储形式为S、E、M,E是阶码的移码形式。由此可见,浮点数的表示又归结到定点整数和定点小数表示问题。 关于浮点数的表示更详细的内容将在2.3节中讨论。2.2.3 机器数形式 对于数据定点表示的符号问题,计算机应如何处理符号位?符号位能否同数值位一样参加运算?为了妥善处理这个问题,下面以n位机为例,介绍几种定点数的机器数形式(若机器数为n位,其中符号位占1位,数值位占n-1位,而小数点隐含)。 1.原码 原码是一种最简单、最直观的机器数表示形式,它与真值的形式最为接近。 1) 原码的定义 设x为n位的二进制数据,式(2-4)和式(2-5)分别给出了x为定点小数±0.x1x2 … xn-1和x为定点整数 ±x1x2 … xn-1的原码定义。定点小数原码的定义:[x]原 =0≤x≤+(1-2-(n-1))-(1-2-(n-1))≤x≤0(2-4) 定点整数原码的定义:[x]原 =0≤x≤+(2n-1-1)-(2n-1-1)≤x≤0(2-5) 【例2-8】 已知二进制数的真值x,求[x]原。 ① x=+0.0010110 ② x=-0.0010110 ③ x=+00010110 ④ x=-00010110 解:由定义可得 ① 因为x≥0,所以[x]原= x = 0.0010110 ② 因为x<0,所以[x]原= 1-x = 1.0010110 ③ 因为x≥0,所以[x]原= x = 00010110 ④ 因为x<0,所以[x]原= 27-x = 10010110 2) 原码所表示的数据大小 以n位定点小数为例,分析原码所表示的数据范围,如下所示:n位定点正小数的原码0.00 … 0 +00.11 … 1 +(1-2-(n-1))n位定点负小数的原码1.00 … 0 -01.11 … 1 -(1-2-(n-1)) 所以,n位定点小数的原码所表示的数据范围为[-(1-2-(n-1)),+(1-2-(n-1))]。0的原码形式有两种:+0的原码为0.00 … 0,-0的原码为1.00 … 0。 3) 原码的运算特点 (1) 原码的移位。原码移位规则:符号位保持不变,数值位进行左移或右移,移出后出现的空位进行补0。 【例2-9】 已知以下两个[x]原,求[2x]原、[x]原。① [x]原 = 0.0101001 ② [x]原 = 1.0101001 解:① [2x]原 = 0.1010010 [ x]原 = 0.0010100 ② [2x]原 = 1.1010010 [ x]原 = 1.0010100 (2) 原码的加减运算。原码的加减运算较复杂,它不仅要判断两个数的符号,确定是进行加法还是进行减法运算,还要比较两个数的绝对值大小来决定运算结果的符号。可见,原码不便于进行加减运算,对原码进行符号位处理的硬件较复杂。为了简化运算,人们提出了机器数的补码形式,从此,不再分别处理符号位和数值位,而把符号位作为数值的一部分参与运算,并能将减法运算转换成加法运算,从而简化了硬件及结构,降低了成本。 2.补码 1) 互补数 在计数制中,为了简化计数,常采用一种计满归零的方法。例如钟表的计时,计满12归0,即12点=0点,于是有:13点=1点,14点=2点,……,23点=11点,24点=0点。因此,钟表是以12为模的计数方式,其数学表达式为12 = 0 (mod 12) 对于钟表的表盘,若时针指向12点,顺时针方向拨时针8格,即表示的时间为8点,而按逆时针方向拨时针4格,表示的时间仍为8点,因此,两种不同方向的拨法其结果是一样的,于是,8和-4是模12的互补数,记为-4 = 8 (mod 12)。 对于任意一个数x,若模为M,则[x]补可由下式进行计算:[x]补 = M+x (mod M) (2-6) 由式(2-6)可知: (1) 当x≥0时,M+x≥M,把M丢掉,[x]补 = x,即正数的补数等于它本身; (2) 当x<0时,[x]补 = M+x = M-|x| 即负数的补数等于模与该数绝对值之差。 【例2-10】 对于二进制数x,求在模M=2的条件下的[x]补。 ① x= +0.0101001 ② x= -0.0101001 解:① 因为x≥0,所以[x]补 = 2 + x = x = 0.0101001 ② 因为x<0,所以[x]补 = 2 + x = 2 - |x| = 2-0.0101001 = 1.1010111 2) 补码的定义 补码实际上是对模的补数,由于机器字长的限制,数据在计算机中的运算是有模运算。设x为n位二进制数据,式(2-7)和式(2-8)分别给出了x为定点小数 ± 0.x1x2 … xn-1和x为定点整数 ± x1x2 … xn-1的补码定义。定点小数补码的定义:[x]补0≤x≤+(1-2- (n-1))-1≤x≤0(mod 2)(2-7)定点整数补码的定义:[x]补0≤x≤2n-1-1-2n-1≤x≤0(mod 2n) (2-8) 【例2-11】 已知以下x,求[x]补。 ① x = +0.0010110 ② x = -0.0010110 ③ x = +00010110 ④ x = -00010110 解:由定义可得 ①因为x≥0,所以[x]补 = x = 0.0010110 ②因为x<0,所以[x]补 = 28+ x = 1.1101010 ③因为x≥0,所以[x]补 = x = 00010110 ④因为x<0,所以[x]补 = 28+ x = 11101010 3) 补码所表示的数据大小 以n位定点小数的补码为例,分析补码所表示的数据范围,如下所示:所以n位定点小数的补码所表示的数据范围为[-1,+(1-2-(n-1))]。小数0的补码形式只有一种:[+0]补=0.00 …0,[-0]补=2+0. 00…0=0.00 …0。 4) 补码的运算特点 (1) [x]补的移位。补码的移位规则:补码左移时,符号位保持不变,数值位进行左移,最低位出现的空位进行补0;补码右移时,符号位保持不变,数值位进行右移,最高位出现的空位填补符号位。 【例2-12】 已知以下[x]补,求[2x]补和[ x]补。① [x]补 = 0.0101001 ② [x]补 = 1.0101001 解:① [2x]补 = 0.1010010 [ x]补 = 0.0010100 ② [2x]补 = 1.1010010 [ x]补 = 1.0010100 在补码左移过程中,注意不要把高位的数值位移出,否则将会出错。例如,将8位定点正小数补码[x]补=0.1010011进行左移时,需要将最高数值位的1移出,如果将1移入符号位,正数的补码变成了负数的补码,造成符号出错;如果将1丢掉,又会失去最高位的有效数值而导致出错。同理,对于8位定点负小数补码[x]补=1.0010011进行左移时,也会出现同样的错误。 (2) [x]补与[x]原的转换。若x≥0,则[x]原=[x]补。若x<0,则将[x]原除符号位以外的各位取反后,再在最低位上加1,即得到[x]补;反之,将[x]补除符号位以外的各位取反后,再在最低位上加1,即得到[x]原。 【例2-13】 已知以下[x]原,求[x]补。 ① [x]原=0.0010110 ② [x]原=1.0010110 ③ [x]原=00010110 ④ [x]原=10010110 解:由定义可得 ① 因为x≥0,所以[x]补=[x]原= 0.0010110 ② 因为x<0,所以[x]补=1.1101010 ③ 因为x≥0,所以[x]补=[x]原= 00010110 ④ 因为x<0,所以[x]补=11101010 从【例2-13】的结果我们还可以看出以下规律:当x<0时,保持原码的符号位不变,从原码的最低位开始向高位扫描,在遇到第一个1之后,保持该位1和比它低的各位不变,将其余位取反,即得到[x]原对应的补码。 【例2-14】 已知以下[x]补,求[x]原。 ① [x]补=0.0010110 ② [x]补=1.0010110 ③ [x]补=00010110 ④ [x]补=10010110 解:由定义可得 ① 因为x≥0,所以[x]原=[x]补= 0.0010110 ② 因为x<0,所以[x]原=1.1101010 ③ 因为x≥0,所以[x]原=[x]补= 00010110 ④ 因为x<0,所以[x]原=11101010 (3) [x]补与[-x]补的关系。已知[x]补求[-x]补称为对[x]补求补或变补。其规则是:将[x]补的各位取反(包括符号位),然后在最低位加1,即得到[-x]补;反之亦然。 【例2-15】 已知以下[x]补,求[-x]补。 ① [x]补=0.0010110 ② [x]补=1.0010110 ③ [x]补=00010110 ④ [x]=10010110 解:由定义可得 ① [-x]补=1.1101010 ② [-x]补=0.1101010 ③ [-x]补=11101010 ④ [-x]补=01101010 3.反码 反码实质上是一种特殊的补码,其特殊性在于反码的模比补码的模小2n-1。 1) 反码的定义 设x为n位的二进制数据,式(2-9)和式(2-10)给出了x为定点小数 ±0.x1x2 … xn-1和x为定点整数 ±x1x2 … xn-1的反码定义。 定点小数反码的定义:0≤x≤+(1-2-(n-1))-(1-2-(n-1))≤x≤0(2-9)定点整数反码的定义:0≤x≤2n-1-1-(2n-1-1)≤x≤0(mod (2-2-(n-1))(mod (2n-1))(2-10) 【例2-16】 已知以下x,求[x]反。 ① x = +0.0010110 ② x = -0.0010110 ③ x = +00010110 ④ x = -00010110 解:由定义可得 ① [x]反 = 0.0010110 ② [x]反 = 1.1101001 ③ [x]反 = 00010110 ④ [x]反 = 11101001 2) 反码所表示的数据大小 以n位定点小数为例,分析反码所表示的数据范围,如下所示:所以n位定点小数的反码所表示的数据范围为[-(1-2-(n-1)),+(1-2-(n-1))]。小数0的反码形式有两种:+0的反码为0.00 …0,-0的反码为1.11 … 1。 4.移码 移码通常用来表示浮点数的阶码e。我们知道阶码是整数,若采用定点整数补码形式表示,补码的符号位可以作为数值位,这样一来,负数补码的值总大于正数补码的值,在进行对阶时,需要比较两个浮点数的阶码大小。因为比较起来不太直观和方便,因此人们提出了移码形式。浮点数阶码e的移码形式记为“E”。移码E实质上是将阶码e的真值映射到一个正数域,这样移码E的大小可以直观地反映出真值的大小,便于比较。若阶码e的真值范围为[-128,+127],则E=128+e,移码E的范围是[0,255]。 1) 移码的定义 设x为n位的二进制数据,式(2-11)给出了x为定点整数 ±x1x2…xn-1的移码定义。 定点整数移码的定义如下:[x]移 = 2n-1 + x -2n-1≤x≤2n-1-1 (2-11)由式(2-11)可知,移码是把真值x在数轴上正向平移了2n-1,所以,移码也称为增量或余码。 2) 移码所表示的数据大小 对于n位定点整数的移码,其表示的数据范围如下所示: 所以,n位定点整数的移码所表示的数据范围为[0,2n-1],0的移码形式只有一种,即 100 …0。 3) 移码与补码的关系 (1) 当0≤x≤2n-1-1时,因为[x]补=x,[x]移=2n-1+x,所以[x]移=2n-1+[x]补; (2) 当-2n-1≤x<0时,因为[x]补=2n+x,[x]移=2n-1+x,所以[x]移=2n-1+[x]补-2n=[x]补-2n-1。 【例2-17】 已知以下二进制数x,求[x]补和[x]移。 ① x = +00101001 ② x = -00101001 解:① 因为x≥0,所以[x]补=00101001 [x]移=10101001 ② 因为x<0,所以[x]补=11010111 [x]移=010101112.3 浮点数的表示2.3.1 浮点数的格式 由浮点表示法可知,计算机中的一个浮点数由阶码E、尾数M和符号S三部分组成。其中,E为定点整数的移码形式,M为定点小数的补码形式,S为数符。由于这三部分所占的位置和长度不同,浮点数的格式也不相同,为此,美国IEEE(电气电子工程师协会)提出了一个从系统结构角度支持浮点数的表示方法,称为IEEE 754标准,是目前计算机普遍采用的标准。 1.32位单精度浮点数格式(IEEE 754标准) 32位单精度浮点数格式如下所示: 其中:S表示数符,占1位,为0表示“+”,为1表示“-”;E表示阶码e的移码形式,占8位,包括1位阶符和7位数值,将阶码e的真值平移127便转换成移码E,即E=127+e,移码E的取值范围为[1,254],0和255用于表示特殊含义的数值;M表示尾数,占23位,由于尾数的规格化要求,IEEE 754标准约定小数点左边隐含一位“1”,从而使尾数的实际有效位为24位,即尾数的有效值为1.M。 根据上述规定,32位单精度浮点数所表示的数值x为x = (-1)S × 2E-127 × 1.M (1) 若E=0,且M=0,则x为0; (2) 若E=0,且M≠0,则x = (-1)S × 2-127 × 1.M,为非规格化浮点数; (3) 若1≤E≤254,则x = (-1)S × 2E-127 × 1.M,为规格化浮点数; (4) 若E=255,且M≠0,则x为“非数值”; (5) 若E=255,且M=0,则x = (-1)S×∞。 值得注意的是:非规格化浮点数和0的尾数M前的隐含位是“0”,而不是“1”。 【例2-18】 将5/32和-69.625表示成IEEE 754单精度浮点数的格式。 解:① 5/32 = 0.00101B = 1.01B × 2-3,按IEEE 754单精度浮点数的要求,因为x≥0,所以S = 0。因为尾数的有效值为1.M,所以M = 01000000000000000000000B。因为E = 127+e,所以E = 127 + (-3) = 124 = 01111100B5/32表示成IEEE 754单精度浮点数的格式如下: ② 因为-69.625 = -1000101.101B = -1.000101101B × 26所以S = 1,M = 00010110100000000000000B,E = 127+6 = 133 = 10000101B,其浮点数格式如下: 【例2-19】 将IEEE 754单精度浮点数42E48000H转换成真值十进制数。 解:按IEEE 754定义的单精度浮点数格式 单精度浮点数42E48000H可表示为S=1,E=10000101B=133,M=11001001000000000000000B=0.78515625,其浮点数对应的真值为(-1)S ×2E-127×1.M = (-1)0×2133127×1.78515625=1.78515625×26 = 114.25 2.64位双精度浮点数格式(IEEE 754标准) 64位双精度浮点数格式如下所示: 64位双精度浮点数所表示的数值x为x = (-1)S×2E-1023×1.M2.3.2 浮点数的规格化 浮点数规格化的目的在于:一方面为了提高运算精度,尽可能占满尾数的位数,以保留更多的有效数字;另一方面保证了浮点数的唯一性。例如,对于浮点数0.001011×26,因为0.001011×26=0.101100×24=0.000001011×29 = …所以同一个数0.001011×26有多种表示,因而无法保证其唯一性。另外,如果规定尾数为6位,0.000001011×29就成了0.000001×29,从而丢掉了有效数字,降低了数的精度。对于基数R为2的浮点数,其规格化条件是:0.5≤|M|<1。在计算机中,浮点数通常是以规格化形式存储和参加运算的。如果运算结果出现了非规格化浮点数,则必须对结果进行规格化处理。2.3.3 浮点数的表示范围 当浮点数的格式被确定后,它所表示的数据范围也就确定了。求浮点数的表示范围,实质上是分析出浮点数所表示的最大数及最小数。下面针对基数R为2的浮点数(阶码为m+1位(包括1位阶符),尾数为n+1位(包括1位数符),分别讨论不同形式的机器数所表示的规格化和非规格化的最大数及最小数。 1.阶码和尾数均采用原码表示 当阶码和尾数均采用原码表示时,典型浮点数的机器数和真值如表2-3所示。表2-3 阶码和尾数均用原码表示时机器数的规格化和非规格化最大、最小数 2.阶码和尾数均采用补码表示 阶码和尾数均采用补码表示时,典型浮点数的机器数和真值如表2-4所示。表2-4 阶码和尾数均用补码表示时机器数的规格化和非规格化最大、最小数 3.阶码和尾数分别采用移码和补码表示 阶码和尾数分别采用移码和补码表示时,典型浮点数的机器数和真值如表2-5所示。表2-5 阶码用移码、尾数用补码表示时机器数的规格化和非规格化最大、最小数2.3.4 浮点数的机器零 计算机在对浮点数进行处理的过程中,首先是判“0”,因为当一个浮点数是“0”时,运算可以简化。机器零是指如果一个浮点数的尾数为全0,则不论阶码为何值;或者如果一个浮点数的阶码小于它所能表示的最小值,则不论其尾数为何值,计算机都会把这种浮点数当做零看待。特别是当阶码用移码表示、尾数用补码表示时,如果阶码为它所表示的最小数-2m(阶码为m位)且尾数为0时,其阶码的移码形式全为0,尾数的补码形式也全为0,这时的浮点数的机器数形式也全为0,从而有利于简化机器的判0电路。2.4 非数值数据的表示2.4.1 字符与字符串 字符和字符串是计算机中用得最多的非数值数据,人们利用字符和字符串编写程序、表达文字及各类信息,以便与计算机进行交流。为了使计算机硬件能够识别和处理字符,必须对字符按一定规则用二进制进行编码。 1.ASCII码 ASCII码(American Standard Code for Information Interchange,美国标准信息交换码)是目前国际上广泛使用的字符编码。ASCII码为7位二进制编码,可表示128个字符,包括10个数字字符(0~9)、52个英文字母(大、小写各26个)、34个常用符号和32个控制字符(如数符NUL、回车符CR、换行符LF等)。表2-6所示为ASCII编码。7位ASCII码用b6b5b4b3b2b1b0表示,其中b6b5b4为ASCII码的高3位,是字符所在表中列的编码;b3b2b1b0为ASCII码的低4位,是字符所在表中行的编码。 在计算机中,一个字符用一个字节表示,由于ASCII码只有7位,因此,表示字符的字节的最高位b7有以下用法: (1) b7置0,用于表示字符的ASCII码; (2) b7置1,用于表示汉字的编码; (3) b7用作奇偶校验位。表2-6 ASCII 码 表 2.字符串 字符串是指连续的一串字符。由于一个字符占一个字节单元,所以字符串在存储时要占连续的多个字节单元。至于存储顺序不同的机器可以有不同的规定,字符串中的字符既可以从低位字节向高位字节顺序存放,也可以从高位字节向低位字节顺序存放。2.4.2 BCD码与十进制数 1.8421BCD码 BCD(Binary Coded Decimal)码是对一位十进制数所进行的编码,其目的在于:一方面方便快捷地将十进制数转换成二进制形式的数据;另一方面直接实现对十进制数的运算。BCD码的编码方法有多种,较常用的有8421BCD码、2421BCD和余3码。常见的BCD码如表2-7所示。表2-7 常见BCD码 8421BCD码是4位二进制编码,“8421”是指4个位置的位权分别为8、4、2、1,有且只有10个编码。由于4位二进制的编码有且只有16个编码,所以8421BCD码与4位的二进制编码之间并不存在一一对应的关系。在对十进制数直接进行运算时,其结果可能会出现非8421BCD码,此时需要及时进行加6(0110)修正,否则运算的结果会出错。 另外需要注意的是,BCD码是对一位十进制数所进行的编码,对于多位十进制数,则应用多个BCD码组合起来表示。例如十进制数147,对应的8421BCD码为0001 0100 0111。 2. 十进制数 1) 非压缩型十进制数 非压缩型十进制数主要应用于显示、打印等非数值处理过程中,是将十进制数以字符串的形式进行表示,即把十进制数中的每一位数字以及数的正、负符号都当一个字符,用一个字节表示其ASCII码。根据数的符号(+、-)的ASCII码所存储的位置不同,非压缩型十进制数又可分为前分隔非压缩型十进制数和后嵌入非压缩型十进制数。 (1) 前分隔非压缩型十进制数。前分隔非压缩型十进制数的表示方法是:数的符号占一个字节,正号“+”的ASCII码为2BH,负号“-”的ASCII码为2DH,位于十进制数的数字位之前。 【例2-20】 采用前分隔非压缩型十进制数,写出十进制数+256和-1716在内存的存储形式。 解:+256在内存的存储形式如下: 十进制数+256在内存中共占4个字节单元。 -1716在内存的存储形式如下:十进制数-1716在内存中共占5个字节单元。 (2) 后嵌入非压缩型十进制数。 后嵌入非压缩型十进制数的表示方法是:数的符号不单独占一个字节,而是嵌入到最低位数字的编码中。其嵌入规则是:若数的符号为正号“+”,则最低位数字的ASCII码保持不变;若数的符号为负号“-”,则最低位数字的ASCII码加上40H。 【例2-21】 采用后嵌入非压缩型十进制数,写出十进制数 +256和 -1716在内存的存储形式。 解:+256在内存的存储形式如下: 十进制数+256在内存中共占3个字节单元 -1716在内存的存储形式如下:十进制数-1716在内存中共占4个字节单元。 2) 压缩型十进制数 压缩型十进制数既能节省存储空间,又便于直接进行十进制运算,是被广泛采用的十进制数表示方法。此方法是用一个字节存放两位十进制数的BCD码,数的符号(+、-)占半个字节,并存放在最低位数字的BCD码之后。数的符号所占的半个字节规定为:“1100”表示正号(+),“1101”表示负号(-)。为了保证此表示方法不会出现只有半个字节的情况,规定压缩型十进制数数字个数和1位符号之和必须是偶数,否则,在最高位数字之前补一个数字0。 【例2-22】 采用压缩型十进制数,写出十进制数+256和-1716在内存的存储形式。 解:+256在内存的存储形式如下:十进制数+256在内存中共占2个字节单元。-1716在内存的存储形式如下:十进制数-1716在内存中共占3个字节单元。2.5 数 据 校 验 码 数据在存储和传送的过程中,难免出现错误。为了减少和避免错误的发生,一方面从硬件方面采取措施,提高硬件本身的抗干扰能力和可靠性;另一方面在数据编码上采取检错纠错的措施,使得机器能够自动发现错误,甚至能纠正错误。我们把这种具有检测错误或带有自动纠错能力的数据编码称为数据校验码。其原理是在数据中加入一些校验位,组成数据校验码,通过检查数据校验码的合法性来判断是否出错或进行纠错。常用的数据校验码有奇偶校验码、海明校验码和循环冗余校验码(CRC)等。2.5.1 奇偶校验码 奇偶校验码是一种最简单、最常用的校验码,被广泛应用于内存的读写校验和串行通信。 1.奇偶校验码的编码 对于n位二进制数D=dn-1dn-2…d1d0,添加一位校验位P,P的位置可以在数据D的最高位dn-1之前,也可以在数据D的最低位d0之后,并且P是数据D的函数,即P=f(D)。于是,n位数据D和1位校验位P便构成了一个n+1位的奇偶校验码。奇偶校验码根据P~D之间的函数不同,可分为偶校验和奇校验。 (1) 偶校验(Even):加入一位校验位PEven后,使得n+1位的奇偶校验码中“1”的个数为偶数,因此,PEven=dn-1 dn-2 …d1 d0。 (2) 奇校验(Odd):加入一位校验位POdd后,使得n+1位的奇偶校验码中“1”的个数为奇数,因此,POdd= 。 2.奇偶校验码的校验 发送端将一个奇偶校验码发送后,接收端需要对接收到信息进行校验,判断所接收到的数据是否有误,以决定其取舍。具体校验方法为:如果接收端接收到一个1的个数为偶数的奇校验码,或接收端接收到一个1的个数为奇数的偶校验码,则表示接收端所接收的是一个有错的校验码。通过设置出错标志E(E=0,表示无误;E=1,表示有误)很容易实现校验。 (1) 偶校验的出错标志EEven:EEven= dn-1dn-2 … d1 d0 PEven。 (2) 奇校验的出错标志EOdd:E Odd= dn-1 dn-2 … d1 d0 POdd。 3.奇偶校验码的纠错能力 根据奇偶校验码的校验,可知奇偶校验码只能发现一位出错或奇数位同时出错,至于出错的位置,则是无法确定的,因此,且奇偶校验码无法实现纠错功能。尽管如此,由于一位出错的概率远远高于多位同时出错的概率,奇偶校验码能够满足一般可靠性的要求,因此,奇偶校验码一种最简单、最常用的数据校验码,它被广泛应用于对存储器中数据的检查或传送数据的检查。2.5.2 海明校验码 海明校验码是由Richard Hamming于1950年提出的,目前仍被广泛应用。它是在奇偶校验的基础上,通过合理增加校验位的位数来组成海明校验码的。它不仅能够实现发现多位出错,而且能够对一位出错进行自动纠正。 1.海明校验码中校验位的位数 设数据的位数为n,校验位的位数为k,则组成的海明校验码为n+k位。校验时,k位校验位的编码共有2k种状态,其中只有一种状态用来表示数据无误,其余2k-1种状态用来表示数据有措。由于海明校验码共n+k位,所以校验位的位数k与数据的位数n应满足:2k-1≥n+k (2-12) 根据式(2-12)可计算出具有检测一位出错并能纠正一位错误能力的海明校验码中k与n的具体对应关系,如表2-8所示。表2-8 海明校验码中校验位的位数k与数据的位数n的关系 2.海明校验码的编码 设n位的数据为Dn-1…D1D0,k位的校验位为Pk-1…P1P0,组成的海明校验码为HmHm-1…H1,其中m=n+k,海明校验码的编码规则如下: (1) 校验位Pi在海明校验码HmHm-1…H1中的位置。每一个校验位Pi在海明校验码中被安置在位号为2i的位置(i∈{0,1,…,k-1}),校验位Pk-1可能不满足这个关系,将其安置在海明校验码的最高位。其余各位为数据位,并按从低位到高位依次排列。 (2) 海明校验码HmHm-1…H1的校验。海明校验码HmHm-1…H1中的每一位Hj是由多个校验位Pi来校验的(i∈{0,1,…,k-1}),其关系是被校验的每一位位号j等于校验它的各个校验位的位号之和。 (3) 校验位Pi的形成。根据规则(2),找出校验位Pi参与了对哪些数据位的校验;反过来,被校验的这些数据位按照奇偶校验原理形成校验位Pi。下面以一个字节的数据为例来讨论海明校验码。由于数据为8位,即n=8,按式(2-12)可求出校验位的位数k=5,海明校验码的总位数为13位,表示为H13H12…H1。 按规则(1),可知海明校验码为P4D7D6D5D4P3D3D2D1P2D0P1P0。 按规则(2),可以得到表2-9所示的结果。表2-9 海明校验码与校验位的关系 按规则(3),可以将形成校验位Pi的数据位进行分组,即校验组的分组。如果需要区分是两位出错还是一位出错,可以补充一个总校验位P4,则P0:D0,D1,D3,D4,D6P1:D0,D2,D3,D5,D6P2:D1,D2,D3,D7P3:D4,D5,D6,D7P4:D0,D1,D2,D3,D4,D5,D6,D7,P0,P1,P2,P3 若采用偶校验,则各个校验位的形成方法如下: P0 = D0 D1 D3 D4 D6 P1 = D0 D2 D3 D5 D6 P2 = D1 D2 D3 D7 P3 = D4 D5 D6 D7 P4 = D0 D1 D2 D3 D4 D5 D6 D7 P0 P1 P2 P3 3.海明校验码的校验 在接收端收到海明校验码后,需对k个校验位分别进行k组奇偶校验,以判断数据传输是否出错。分组校验后,校验结果形成k位的状态字Sk-1…S1S0,若状态字Sk-1…S1S0全0,则表示数据传输无误;否则,表示数据传输有误,状态字Sk-1…S1S0所对应的十进制数值就是出错位的位号,将该位取反,即可实现纠错。下面以一个字节数据的海明校验码为例来说明校验过程。校验时按偶校验,状态字S4S3S2S1S0的形成如下: S0 = P0 D0 D1 D3 D4 D6 S1 = P1 D0 D2 D3 D5 D6 S2 = P2 D1 D2 D3 D7 S3 = P3 D4 D5 D6 D7 S4 = P4 D0 D1 D2 D3 D4 D5 D6 D7 P0 P1 P2 P3 状态字S4S3S2S1S0能够反映13位海明校验码的出错情况。当错误个数为偶数时,S4为0;当错误个数为奇数时,S4为1。以此可以判断是一位出错还是两位出错。2.5.3 循环冗余校验码在一位出错概率远远大于多位同时出错概率的情况下,奇偶校验是一种简单而有效的检查方法,但在串行通信中,常常会遇到瞬间干扰,造成多位数据同时发生错误,此时,使用奇偶校验码意义不大,通常采用循环冗余校验码,即CRC(Cyclic Redundancy Check)码。它是一种具有很强检错纠错能力的校验码。 1.循环冗余校验思想 用n位数据dn-1…d1d0构成一个x的n-1次幂的多项式为M(x),即M(x)= dn-1xn-1+dn-2 xn-2+…+d1x1+d0,再用一个约定的多项式G(x)去除M(x),可得以下关系式:(2-13)其中,Q(x)为商数,R(x)为余数。 由式(2-13)可得:M(x)-R(x)=Q(x) × G(x)(2-14) 发送端将M(x)-R(x)作为校验码进行发送,接收端收到校验码后,用双方约定的多项式G(x)去除,如果能够被整除,即余数为0,则表示数据传输无误,否则表示数据传输有误。 2.模2运算 由式(2-14)可知,M(x)-R(x)是减法运算,需要涉及到借位,难以用简单的拼装方法实现编码,为了回避借位运算,CRC码采用了模2运算。所谓模2运算,是指以按位模2加运算为基础的二进制四则运算。简单地讲,模2运算是一种不考虑进位和借位的运算。 1) 模2加减 模2加减是按异或规则实现按位加,不进位。其运算规则是:0 ± 0 = 0,0 ± 1 = 1,1 ± 0 = 1,1±1 = 0 【例2-23】 按模2加减规则,计算1101+1011和1101-1011。 解:根据模2加减规则可得① 1101+1011 = 0110 ② 1101-1011 = 0110 由此可见,模2的加法运算等于模2的减法运算。 2) 模2乘 模2乘就是在进行乘法运算时,按模2加的运算规则,对各个位积进行模2加法。 例如1010 × 1011 = 1001110。 3) 模2除 模2除就是在进行除法运算时,按模2减的运算求部分余数,计算时不进行借位。 例如1011001÷1101 = 1100,余数为101。 3.CRC码的编码 用n位数据dn-1…d1d0构成一个x的n-1次幂的多项式为M(x),即M(x)=dn-1xn-1+dn-2xn-2+…+d1x1+d0,约定一个生成多项式G(x)为x的k+1次幂的多项式,即G(x)=Ckxk+Ck-1xk-1+…+C1x1+C0,G(x)作为除数的余数多项式R(x)最高次幂为xk-1,因此R(x)相当于k位余数形成的多项式。把k位余数拼接在n位数据位之后,便构成n+k位的CRC码。CRC码的编码只是简单地拼接,关键是如何根据数据去产生k位余数。 由于n位数据位后附加了k位余数,n位数据构成一个x的n-1次幂的多项式M(x)相当于提高了xk-1阶,即M(x)·xk-1。然后按模2除法,用M(x)·xk-1除以G(x),便得到余数多项式R(x),该多项式中x的各个次幂的系数就是k位余数。(2-15)由式(2-15)可得M(x)·xk-1-R(x) = Q(x) × G(x)根据模2加减运算规则可得M(x)·xk-1 + R(x) = Q(x) × G(x) (2-16) 【例2-24】 设生成多项式G(x) = x3+x1+1,求4位数据1101的CRC码。 解:因为G(x)=x3+x1+1,是4位的多项式,所以余数是3位。 根据式(2-16)可得3位的余数为101,因此4位数据1101的CRC码为1101101。 在CRC码中,由n位数据和k位校验构成的n+k位的CRC码,也称为(n+k,n)码。 在例2-24中,由于n=4,n+k=7,故称(7,4)码。 4.CRC码的校验 接收端收到CRC码后,用双方约定的生成多项式G(x)做模2除,如果除得的余数为0,则表示接收到的信息中没有错误;否则表示接收到的信息中某一位发生错误。出错的位置不同,相应的余数也不同,因此,可以根据余数来确定出错的位置,进而实现纠错功能。 在例2-24中,4位数据1101(7,4)码的出错情况如表2-10所示。表2-10 4位数据1101基于G(x)=x3+x1+1(7,4)码的校验 以表2-10中的第二行为例,对余数001补0后再除以G(x),得到的第二次余数为010,第二次余数为010再补0后除以G(x),得到的第三次余数为100,按此继续做除法,不难发现所得的余数依次为011、110、111、101,最后又回到001,这就是为什么将此校验码称之为循环校验码的原因。根据循环码的这一特点,当接收端收到CRC码与生成多项式G(x)做模2除得到的余数不为0时,可以一边对余数补0继续做模2除,同时使被检测的CRC码循环左移,当出现的余数为101时,原来出错的位已移到F7的位置,将其取反进行纠错后,在下次移位时送回F1,将CRC码继续循环左移,移满一个循环后,可得到一个纠错后的CRC码。 例如,若接收端收到CRC码字为1010111,用G(x)=x3+x1+1做模2除,得到的余数为100,说明接收到的信息中某一位发生错误。将此余数补0后再除以G(x),同时使CRC码循环左移。进行如此运算4次后,得到的余数为101,此时,CRC码也循环左移了4位,变成了1111010。出错位已移至F7,将其取反可得0111010。再将它循环左移3位,补足7次(一个循环),出错位又回到F3,便得到一个正确的码字1010011。 5.生成多项式G(x) 由前面的内容可知,在CRC码的形成和校验过程中,生成多项式G(x)起着非常重要的作用。采用的生成多项式G(x)不同,所形成的CRC码字和码距不同,其检错和纠错能力也不同。并非任何一个x的k+1幂的多项式都可以作为生成多项式,它应满足以下要求: (1) 任何一位发生错误都应使余数不为0; (2) 不同位发生错误时,其余数应不同; (3) 对余数做模2除,应能使余数循环。 为便于选择满足以上要求的生成多项式G(x),表2-11列出了常用的生成多项式。 在数据通信与网络中,由于数据位数多,上千位二进制数据位构成一帧,为检测信息传输的正确与错误,广泛采用CRC码进行校验。这时所使用的生成多项式的幂比较高,常用的生成多项式有: G(x)=x16+x15+x2+1 G(x)=x16+x12+x5+1 G(x)=x32+x26+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1表2-11 常用的生成多项式G(x)关 联习 题2.1 数制转换。(1) 213 = ( )B = ( )H(2) 0F8EH = ( )B = ( )D(3) 69.75 = ( )B = ( )H(4) 10111011B = ( )D = ( )H(5) 110000010.0101 B = ( )D =( )H 2.2 设机器字长为8位(含一位符号位),分别求出[x]原、[x]反、[x]移、[x]补、[-x]补、[ x]补。 (1) x =+119 (2) x =-56 (3) x=-1 (4) x = +25/128 (5) -37/64 2.3 已知x的二进制真值,试求[x]补、[-x]补、[ x]补、[ x]补、[2x]补、[4x]补、[-2x]补、[-x]补。(1) x =+0.0101101 (2) x =-0.0001011 (3) x =-1 2.4 已知[x]补,求x的真值。 (1) [x]补=0.1010111 (2) [x]补=1.1110010 (3) [x]补=0.0101101 (4) [x]补=1.11111112.5 设十进制数x=(+124.625)×2-10。 (1) 写出x对应的二进制定点小数表示形式。 (2) 若机器的浮点数表示格式如下:其中,阶码和尾数的基数均为2。 ① 写出阶码和尾数均采用原码表示时的机器数形式。 ② 写出阶码和尾数均采用补码表示时的机器数形式。2.6 设某机器数的字长为16位,数据表示格式如下所示。定点数:浮点数:分别写出下列数据表示形式中所能表示的最小正数、最大正数、最大负数、最小负数(绝对值最大的负数)以及浮点规格化最小正数、最大负数所对应的十进制真值。 (1) 原码表示的定点整数; (2) 补码表示的定点整数; (3) 阶码与尾数均用原码表示的浮点数; (4) 阶码与尾数均用补码表示的浮点数; (5) 阶码为移码、尾数用补码表示的浮点数。 2.7 设题2.6的浮点数格式中,阶码与尾数均用补码表示,分别写出下面用十六进制书写的浮点数所对应的十进制真值。 (1) FFFFH (2) C400H 2.8 写出下列十进制数的IEEE 754标准32位单精度浮点数的机器数表示形式。 (1) 0.15625 (2) -0.15625 2.9 写出IEEE 754标准32位单精度浮点数所能表示最小规格化正数和最大规格化负数的机器数表示形式。 2.10 写出下列十六进制的IEEE 754单精度浮点数所代表的十进制数真值。 (1) 42E48000H (2) 3F880000H (3) 00800000H (4) C7F00000H 2.11 设有两个正浮点数:N1=M1× ,N2=M2× 。 (1) 若e1>e2,是否有N1>N2 (2) 若M1、M2均为规格化数,上述结论是否正确?2.12 设一个6位二进制小数x=0.a1a2a3a4a5a6,x≥0,请回答: (1) 若要x≥ ,a1a2a3a4a5a6需要满足什么条件? (2) 若要x> ,a1a2a3a4a5a6需要满足什么条件? (3) 若要≥x> ,a1a2a3a4a5a6需要满足什么条件? 2.13 分别用前分隔数字串、后嵌入数字串和压缩的十进制数串形式表示下列十进制数。 (1) +79 (2) -635 (3) +2008 (4) -8510 2.14 下面是两个字符(ASCII码)的海明校验码(偶校验),请检测它们是否有错。如果有错,请加以改正,并写出相应的正确ASCII码所代表的字符。 (1) 10111010011 (2) 10001010110 2.15 设数据信息是1010110010001111,选择生成多项式为G(x)=100101,求出数据的CRC码。 2.16 完成下列8421 BCD码与其他数制/码制的转换。 (1) (1001 0011)BCD = ( )D = ( ) B (2) (0011 0111 0110.011)BCD = ( )D = ( ) B (3) 11010011B = ( )BCD (4) 110000010.0101B = ( )BCD (5) 151.625 = ( ) B = ( )BCD 2.17 计算下列BCD码的和,并按规则进行十进制调整。 (1) 96+87 (2) 1556+298 2.18 选择题。 (1) 某机器字长64位,1位符号位,63位尾数。若采用定点小数表示,则最大正小数为( )。 A.+(1-2-64) B. +(1-2-63) C. 2-64 D. 2-63 (2) 设[x]补=1.x1x2x3x4x5x6x7x8,当满足( )时,x>-成立。 A. x1=1, x2x3x4x5x6x7x8至少有一个为1B. x1=0, x2x3x4x5x6x7x8至少有一个为1C. x1=1, x2x3x4x5x6x7x8任意D. x1=0, x2x3x4x5x6x7x8任意 (3) 在下列机器数中,以下( )表示方式下零的表示形式是唯一的。 A. 原码 B. 补码 C. 反码 D. 都不是 (4) 下列论述中,正确的是( )。 A. 已知[x]原,求[x]补的方法是在[x]原的末位加1 B. 已知[x]补,求[-x]补的方法是在[x]补的末位加1 C. 已知[x]原,求[x]补的方法是将尾数连同符号位一起取反,再在末位加1 D. 已知[x]补,求[-x]补的方法是将尾数连同符号位一起取反,再在末位加1 (5) IEEE 754标准规定的32位浮点数格式中,符号位为1位,阶码为8位,尾数为23位,则它所能表示的最大规格化正数为( )。 A. +(2-2-23)×2+127 B. +(1-2-23)×2+127 C. +(2-2-23)×2+255 D. 2+127×2-23 (6) 浮点数的表示范围取决于( )。 A. 阶码的位数 B. 尾数的位数 C. 阶码采用的编码 D. 尾数采用的编码 (7) 假定下列字符码中有奇偶校验位,但没有数据错误,采用奇校验位的编码是( )。 A. 10000010 B. 11010110 C. 11010111 D. 10111011 2.19 填空题。 (1) 设某机器字长为8位(含一符号位),若[x]补=11001001,则x所表示的十进制数的真值为______。[ x]补=______;若[y]移=11001001,则x所表示的十进制数的真值为______;y的原码表示[y]原=_______。 (2) 在带符号数的编码方式中,零的表示是唯一的有_______和_______。 (3) 若[x1]补=10110111,[x2]原=1.01101,则数x1的十进制数真值是_______,x2的十进制数真值是_______。 (4) 设某浮点数的阶码为8位,用移码表示;尾数为24位,采用规格化补码表示。则该浮点数能表示的最大正数的阶码为_______,尾数为_______;规格化最小负数的阶码为_______,尾数为_______。 (5) 设有效信息位的位数为k,校验位的位数为r,则能够检测出一位出错并能自动纠错的海明校验码应满足的关系是_______。 展开更多...... 收起↑ 资源预览