首页 第二节 计算机的基本组成

第二节 计算机的基本组成

举报
开通vip

第二节 计算机的基本组成第二节 计算机的基本组成 第三编 中央处理器(CPU) 本篇将剖析CPU的内部结构,讲述CPU的功能,包括计算机的运算、指令系统、时序系统、中断系统及控制单元。 第六章 计算机的运算方法 计算机的应用领域极其广泛,但不论其应用在什么地方,信息在机器内部的形式都是一致的,即均为0和1组成的各种编码。本章主要介绍参与运算的各类数据(包括无符号数和有符号数;定点数和浮点数等),以及它们在计算机中的计算方法。 第一节 无符号数和有符号数 在计算机中参与运算的数有两大类:无符号数和有符号数。 一、无符号数 计...

第二节 计算机的基本组成
第二节 计算机的基本组成 第三编 中央处理器(CPU) 本篇将剖析CPU的内部结构,讲述CPU的功能,包括计算机的运算、指令系统、时序系统、中断系统及控制单元。 第六章 计算机的运算 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 计算机的应用领域极其广泛,但不论其应用在什么地方,信息在机器内部的形式都是一致的,即均为0和1组成的各种编码。本章主要介绍参与运算的各类数据(包括无符号数和有符号数;定点数和浮点数等),以及它们在计算机中的计算方法。 第一节 无符号数和有符号数 在计算机中参与运算的数有两大类:无符号数和有符号数。 一、无符号数 计算机中的数均放在寄存器中,通常称寄存器的位数为机器字长。所谓无符号数即没有符号的数,在寄存器中的每一位均可用来存放数值。当存放有符号数时,则需留出位置存放“符号”。因此,在机器字长相同时,无符号数与有符号数所对应的数值范围不同的。以机器字长为16位为例,无符号数的表示范围为0,65535,而有符号数的表示范围为-32768,+32767(此数值对应原码表示)。 二、有符号数 1(机器数与真值 对有符号数而言,符号的“正”、“负”机器是无法识别的,但由于“正”、“负”恰好是两种截然不同的状态,如果用“0”表示“正”,用“1”表示“负”,这样符号也被数字化了,并且规定将它放在有效数字的前面,这样就组成了有符号数。 如有符号数(小数): 把符号“数字化”的数叫做机器数,而把带“十”或“—”符号的数叫做真值。一旦符号数字化后,符号和数值就形成了一种新的编码。在运算过程中,符号位能否和数值部分一起参加运算,如果参加运算,符号位又需作哪些处理,这些问题都与符号位和数值位所构成的编码有关,这些编码就是原码、补码、反码和移码。 2(原码表示法 原码是机器数中最简单的一种表示形式,其符号位为0表示正数,符号位为1表示负数,数值位即真值的绝对值,故原码表示又称作带符号的绝对值表示。上面列举的4个真值所对应的机器数即为原码。为了书写方便以及区别整数和小数,约定整数的符号位与数值位之间用逗号“,”隔开:小数的符号位与数值位之间用小数点“(”隔开。如上面4个数的原码分别是0.1011、1.1011、0,1100和1,1100。由此可得原码的定义。 (1)整数原码的定义为。 式中x为真值,n为整数的位数。 例如,当x=+1110时,[x]=0,1110 原 4 当x=-1110时,[x]=2-(-1110),1,1110 原 小数原码的定义为 例如,当x=+0.1101时,[x]=0.1101 原 当x=-0.1101时,[x]=1-(-0.1101),1.1101 原 根据定义,已知真值可求原码,反之已知原码也可求真值。如:当[x]=1.0011时,由原定义得x=1-[x]=1-1.0011=-0.0011 原n4当[x]=1,1100时,由定义得 x=2-[x]=2-1,1100=10000-11100,-1100 原原 当[x]=0.1101时,x=0.1101 原 (2)“0”的原码表示法。 当x=0时 [+0.0000]=0.0000 原 [-0.0000]=1-(0.0000)=1.0000 原 可见[+0]不等于[-0],即原码中的“零”有两种表示形式。 原原 (3)原码的表数范围。 对于定点整数: n 一个n+1位原码能表示的最大正数为01„11,即2-1;能表示的最小数为绝对值最大nnn的负数111„1,即-(2-1)。所以原码能表示的数值范围为: -(2-1) ? x? 2-1。 对于定点小数: -n 一个n+1位定点小数原码能表示的最大正数为0.1„11,即1-2;能表示的最小数为绝-n-n对值最大的负数为1.11„1,即-(1-2)。定点小数原码的数值范围为: -(1-2) ? x? -n1-2。 原码表示简单明了,并易于和真值转换。但用原码进行加减运算时,却带来了许多麻烦,例如,当两个操作数符号不同且要作加法运算时,先要判断两数绝对值大小,然后将绝对值大的数减去绝对值小的数,结果的符号以绝对值大的数为准。运算步骤既复杂又费时,而且本来是加法运算却要用减法器实现。那么能否在计算机中只设加法器,只作加法操作呢,如果能找到一个与负数等价的正数来代替该负数,就可把减法操作用加法代替。而且机器数采用补码时,就能满足此要求。 3(补码表示法 (1)补数的概念。在日常生活中,常会遇到“补数”的概念。如时钟指示6点,欲使它指示3点,既可按顺时针方向将分针转9圈,又可按逆时针方向将分针转3圈,结果是一致的。假设顺时针方向转为正,逆时针方向转为负,则有 6-3=3 6+9=15 由于时钟的时针转一圈能指示12个小时,这“12”在时钟里是不被显示而自动丢失的,即15-12=3,故15点和3点均显示3点。这样-3和+9对时钟而言作用是一致的。在数学上称12为模,写作mod 12,而称+9是-3以12为模的补数,记作 -3?+9 (mod 12) 或者说对12而言,-3和+9是互为补数的。同理有 -4?+8 (mod 12) -5?+7 (mod 12) 即对模12而言,+8和+7分别是-4和-5的补数。可见,只要确定了“模”,就可找到一个与负数等价的正数(该正数即为负数的补数)来代替此负数,这样就可把减法运算用加法实现。例如: 设A,9,B,5 求:A-B(modl2)。 解:A-B,9-5,4(作减法) 对模12而言,-5可以用其补数+7代替,即 -5?+7 (mod 12) 所以 A-B,9+7,16(作加法) 对模12而言,12会自动丢失,所以16等价于4,即4?16 (mod l2)。 进一步分析发现,3点、15点、27点„„在时钟上看见的都是3点,即 3?15?27 (mod 12) 也即 3?3+12?3+24?3 (mod 12) 这说明正数相对于“模”的补数就是正数本身。 上述补数的概念可以用到任意“模”上,如 -3?+7 (mod 10) +7?+7 (mod l0) 2 -3?+97 (mod l0) 2 +97?+97 (mod l0) 4 1011?+0101 (mod 2) 4 +0101?+0101 (mod 2) 0.1001?+1.0111 (mod 2) +0.1001?+0.1001 (mod 2) 由此可得如下结论; ?一个负数可用它的正补数来代替,而这个正补数可以用模加上负数本身求得。 ?两个互为补数的数,它们绝对值之和即为模数。 ?正数的补数即该正数本身。 将补数的概念用到计算机中,使出现了补码这种机器数。 (2)补码的定义。整数补码的定义为 式中x为真值,n为整数的位数。 例如,当x=+1010时, [x]=0,1010 补 ? 用逗号将符号位和数值部分隔开 当x=-1101时, n+1 [x]=2+x=100000-1101,1,0011 补 ? 用逗号将符号位和数值部分隔开 小数补码的定义为 式中x为真值。 例如,当x=0.1001时,[x],0.1001 补 当x=-0.0110时, [x]=2+x=10.0000-0.0110,1.1010 补 (3)“0”的补码表示法。 当x=0时, [+0.0000]=0.0000 补 [-0.0000]=2+(-0.0000)=10.0000-0.0000=0.0000 补 显然[+0]=[-0]=0.0000,即补码中的“零”只有一种表示表示形式。 补补 n (4)补码的表数范围。一个n+1位整数补码能表示的最大数是011„1,即2-1;能表 nnn示的最小数为100„0,即-2。所以它能表示的数值范围是:-2? x? 2-1 -n 一个n+1位小数补码能表示的最大数是0.11„1,即1-2;能表示的最小数为1.00„ 0, -n即-1。所以它能表示的数值范围是:-1? x? 1-2 对于小数,若x=-1,则根据小数补码定义,有[x]=2+x=10.0000-1.0000,1.0000。可补 见,-1本不属于小数范围,但却有[-1]存在(其实在小数补码定义中已指明),这是由于补 补码中的零只有一种表示形式,故它比原码能多表示一个“-1”。此外,根据补码定义,已知补码还可以求真值,如 若[x]=1.0101 补 则x=[x]-2=1.0101-10.0000=-0.1011 补 若[x]=1,1110 补 4+1 则x=[x]-2=1,1110-100000=-0010 补 若[x]=0.1101 补 则x=[x]=0.1101 补 2 同理,当模数为4时,形成了双符号位的补码。如x=-0.1001,对(mod 2)而言, 2 [x]=2+x=100.0000-0.1001=11.0111 补 这种双符号位的补码又叫做变形补码,它在阶码运算和溢出判断中,有很重要的作用。在形成补码的过程中又出现了减法,如 x=-1011 4+l [x]=2+x=100000-1011=1,0101 补 4+15 若我们把模2改写成2=1000000=11111+00001时,则上式可写成: 5 [x]=2+x=11111+00001-xxxx 补1234 又因x是负数,若x用-xxxx表示,其中x (i=1,2,3,4)不为0则为1,于是上式1234i可写成: 5 [x]=2+x=11111+00001-xxxx 补1234 =1 xxxx+00001 1234 因为任一位“1”减去x即为x,所以上式成立。„ ii 由于负数-xxxx的原码为1,xxxx,因此对这个负数求补,可以看作对它的原码除12341234 符号位外,每位求反,末位加1,简称“求反加1”。这样,由真值通过原码求补码就可避 免减法运算。同理,对于小数也有同样结论。 “由原码除符号位外,每位求反,末位加1求补码”这一规则,同样适用于由[x]求补 [x]。而对于一个负数,若对其原码除符号位外,每位求反(简称“每位求反”),或是对其原 ,即得机器数的反码。 补码减去末位的1 4(反码表示法 反码通常用来作为由原码求补码或者由补码求原码的中间过渡。反码的定义如下: (1)整数反码的定义。 式中x为真值,n为整数的位数。 例如,当x=+1101时, [x]=0,1101 反 ? 用逗号将符号位和数值部分隔开 当x=-1101时, 4+1 [x]=(x-1)+x=11111-1101,1,0010 反 ? 用逗号将符号位和数值部分隔开 小数反码的定义为: 式中x为真值,n为小数的位数。 例如,当x=+0.0110时,[x]=0.0110 反 当x=-0.0110时, -4 [x]=(2-2)+x=1.1111-0.0110=1.1001 反 (2)“0”的反码表示法。 当x=0时, [+0.0000]=0.0000 反 [-0.0000]=(10.0000-0.0001)-0.0000=1.1111 反 可见[+0]不等于[-0],即反码中的“零”也有两种表示形式。 反反 (3)反码的表数范围。 nn 定点整数反码的数值范围为:-(2-1)?x?2-1。 -n-n 定点小数原码的数值范围为:-(1-2)?x?1-2。 -nn+1 实际上,反码也可看作是mod(2-2)(对于小数)或mod(2-1)(对于整数)的补码。与补码相比,仅在末位差1,因此有些书上称小数的补码为2的补码,而称小数的反码为1的补码。 综上所述,三种机器数的特点可归纳如下: ? 三种机器数的最高位均为符号位。符号位和数值部分之间可用“.”(对于小数)或“,”(对于整数)隔开。 ? 当真值为正时,原码、补码和反码的表示形式均相同,即符号位用“0”表示,数值部分与其值相同。 ? 当真值为负时,原码、补码和反码的表示形式不同,但其符号位都用“1”表示,而数值部分有如下关系,即补码是原码的“求反加1”,反码是原码的“每位求反”。 5(移码表示法 (1)移码的定义。当真值用补码表示时,由于符号位和数值部分一起编码,与习惯上的表示法不同,因此人们很难从补码的形式上直接判断其真值的大小,如: 十进制数x=21,对应的二进制数为+10101,则[x]=0,10101; 补 十进制数x=-2l,对应的二进制数为-10101,则[x]=1,01011; 补 十进制数x=31,对应的二进制数为+11111,则[x]=0,11111; 补 十进制数x=-31,对应的二进制数为-11111,则[x]=1,00001; 补 上述补码表示中“,”逗号在计算机内部是不存在的,因此,从代码形式看符号位也是一位二进制数。按这六位二进制代码比较其大小的话,会得出101011>010101,100001>011111,其实恰恰相反。 n 如果我们对每个真值加上一个2(n为整数的位数),情况就发生了变化, 如: 5 x=10101加上2可得10101+100000=110101; 5-10101加上2可得-10101+100000=001011l; x= 5 x=11111加上2可得11111+100000=111111; 5 x=-11111加上2可得-11111+100000=000001; 比较它们的结果可见,110101>001011,111111>000001。这样一来,从六位代码本身就可看出其值的实际大小。 由此可得移码的定义 nnn [x]=2+x (2>x?-2) 移 式中x为真值,n为整数的位数。 n 其实移码就是在真值上加一个常数2。在数轴上移码所表示的范围恰好对应与真值在数 n轴上的范围向轴的正方向移动2个单元。如下图所示,由此而得移码之称。 例如,x=10100 5 [x]=2+10100=1,10100 移 ? 用逗号将符号位和数值部分隔开 x=-10100 5 [x]=2-10100=0,01100 移 ? 用逗号将符号位和数值部分隔开 (2)“0”的移码表示。 当x=0时 5 [+0]=2+0=1,00000 移 5 [-0]=2-0=1,00000 移 可见[+0]移等于[-0],即移码表示中零也是惟一的。 5 此外,由移码的定义可见,当n=5时,其最小的真值为x=-2=-100000,则[-100000] 移5=2+x=100000-100000=0,00000,即最小值的移码为全0,这符合人们的习惯。利用移码的这一特点,当浮点数的阶码用移码表示时,就能很方便地判断阶码的大小。 (3)移码的表数范围。进一步观察发现,同一个真值的移码和补码仅差一个符号位,若将补码的符号位由“0”改为“1”,或从“1”改为“0”,即可得该真值的移码。 nn 整数移码的表数范围和整数补码的表数范围相同,即为-2? x? 2-1 第二节 数的定点表示和浮点表示 在计算机中,小数点不用专门的器件表示,而是按约定的方式标出。共有两种方法来表示小数点的存在,即定点表示和浮点表示。定点表示的数称为定点数,浮点表示的数称为浮点数。 一、定点表示 小数点固定在某一位置的数为定点数,有以下两种格式。 当小数点位于数符和第一数值位之间时,机器内的数为纯小数;当小数点位于数值位之后时,机器内的数为纯整数。采用定点数的机器叫做定点机。数值部分的位数n决定了定点 -n-n机中数的表示范围。若机器数采用原码,小数定点机中数的表示范围是-(1-2),(1-2), nn整数定点机中数的表示范围是-(2-1),(2-1)。 在定点机中,由于小数点的位置固定不变,故当机器处理的数不是纯小数或纯整数时,必须乘上一个比例因子,否则会产生“溢出”。 二、浮点表示 实际上计算机中处理的数不一定是纯小数或纯整数(如圆周率3.1416),而且有些数据 -2833的数值范围相差很大(电子的质量9×10克,太阳的质量2×10克),它们都不能直接用定点小数或定点整数表示,但均可用浮点数表示。浮点数即小数点的位置可以浮动的数,如 2 352.47=3.5247×10 -1 =3524.7×10 3 =0.35247×10 显然,这里小数点的位置是变化的,但因为分别乘上了不同的10的方幂,故值不变。 通常,浮点数被表示成 j N=S×r 式中S为尾数(可正可负),j为阶码(可正可负),r是基数(或基值)。在计算机中,基数可取2、4、8或16等。 以基数r=2为例,数N可写成下列不同形式: N=11.0101 10 =0.110101×2 1 =1.10101×2 -10 =1101.01×2 100 =0.00110101×2 为了提高数据精度以及便于浮点数的比较,在计算机中规定浮点数的尾数用纯小数形 10100式,故上例中0.110101×2和0.00110101×2形式是可以采用的。此外,将尾数最高位 10为1的浮点数称作规格化数,即0.110101×2为浮点数的规格化形式。浮点数表示成规格化形式后,其精度最高。 1(浮点数的表示形式 浮点数在机器中的形式如下所示。采用这种数据格式的机器叫做浮点机。 可见浮点数由阶码j和尾数S两部分组成。阶码是整数,阶符和阶码的位数m合起来反映浮点数的表示范围及小数点的实际位置;尾数是小数,其位数n反映了浮点数的精度;尾数的符号S代表浮点数的正负。 f 2(浮点数的表示范围 j 以通式N= S×r为例,设浮点数阶码的数值位取m位,尾数的数值位取n位,当浮点数为非规格化数时,它在数轴上的表示范围如下所示。 由图可见,其最大正数为;最小正数为;最大负数为 ;最小负数为。当浮点数阶码大于最大阶码时,称为“上 溢”,此时机器停止运算,进行中断溢出处理;当浮点数阶码小于最小阶码时,称为“下溢”,此时“溢出”的数绝对值很小,通常将尾数各位强置为零,按机器零处理,此时机器可以继续运行。 一旦浮点数的位数确定后,合理分配阶码和尾数的位数,直接影响浮点数的表示范围和精度。通常对于短实数(总位数为32位),阶码取8位(含阶符1位),尾数取24位(含数符1位);对于长实数(总位数为64位),阶码取11位(含阶符1位),尾数取53位(含数符1位);对于临时实数(总位数为80),阶码取15位(含阶符1位),尾数取65位(含数符1位)。 3(浮点数的规格化 为了提高浮点数的精度,其尾数必须为规格化数。如果不是规格化数,就要通过修改阶码并同时左右移尾数的办法,使其变成规格化数。将非规格化数转换成规格化数的过程叫做规格化。对于基数不同的浮点数,因其规格化数的形式不同,规格化过程也不同。 当基数为2时,尾数最高位为1的数为规格化数。规格化时,尾数左移一位,阶码减1,(这种规格化叫做向左规格化,简称左规);尾数右移一位,阶码加1(这种规格化叫做向右规格化,简称右规)。浮点数规格化后,其最大正数为;最小正数为 ;最大负数为;最小负数为。 当基数为4时,尾数的最高两位不全为零的数为规格化数。规格化时,尾数左移两位,阶码减1;尾数右移两位,阶码加1。 当基数为8时,尾数的最高三位不全为零的数为规格化数。规格化时,尾数左移三位,阶码减1;尾数右移三位,阶码加1。 n 同理类推,不难得到基数为16或2时的规格化过程。 浮点机中一旦基数确定启就不再变了,而且基数是隐含的,故不同基数的浮点数其表示形式完全相同。但基数不同,对数的表示范围和精度等都受影响。一般来说,基数r越大,可表示的浮点数范围越宽,而且所表示的数其个数越多。但r越大,浮点数的精度反而下降。如r=16的浮点数,因其规格化数的尾数最高三位可能出现零,故与其尾舞位数相同的r=2的浮点数相比,后者可能比俞者多三位精度。 三、定点数和浮点数的比较 定点数和浮点数可从如下几个方面进行比较: (1)当浮点机和定点机中的数其位数相同时,浮点数的表示范围比定点数大得多。 (2)当浮点数为规格化数财,其精度远比定点数高。 (3)浮点数运算要分阶码部分和尾数部分,而且运算结果都要求规格化,故浮点运算步骤比定点运算步骤多,运算速度比定点低,运算线路比定点复杂。 (4)在溢出的判断方法上,浮点数是对规格化数的阶码进行判断,而定点数是对数值本身进行判断。如小数定点机中的数其绝对值必须小于1,否则即“溢出”,此时要求机器停止运算,进行处理。为了防止溢出,上机前必须选择比例因子,这个工作比较麻烦,给编程带来不便。而浮点数的表示范围远比定点数大,仅当“上溢”时机器才停止运算,故一般不必考虑比例因子的选择。 总之,浮点数在数的表示范围、数的精度、溢出处理和程序编程方面(不取比例因子)均优于定点数。但在运算规则、运算速度及硬件成本方面又不如定点数。因此,究竟选用定点数还是浮点数,应根据具体应用综合考虑。一般来说,通用的大型计算机大多采用浮点数,或同时采用定、浮点数;小型、微型及某些专用机、控制机则大多采用定点数。当需要作浮点运算时,可通过软件实现,也可外加浮点扩展硬件(如协处理器)来实现。 四、举例 例:将十进制数+13/128写成二进制定点数和浮点数(数值部分取10位,阶码部分取4位,阶符和数符各取1位),分别写出它在定点机和浮点机中的机器数形式。 解:令x=+13/128 其二进制形式:x=0.0001101000 定点数形式:x=0.0001101000 -11 浮点数规格化表示:x=0.1101000000×2 定点机中 [x]=[x]=[x]=0.0001101000 原补反 浮点机中 [x]:1,0011;0.1101000000 原 [x]:1,1101;0.1101000000 补 五、IEEE754 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 在IEE754浮点数标准中,定义的浮点数的格式如下表所示。其中浮点数编码有32位、64位和80位三种格式,分别称为短实数、长实数和临时实数,短实数和长实数又分别称为单精度数和双精度数。 浮点数 符号位 阶码 尾数 总位数 短实数 1 8 23 32 长实数 1 11 52 64 临时实数 1 25 64 80 在IEE754浮点数标准中,符号位s仍然用0表示正数,用1表示负数。正常数的阶码取值e的范围为1,254,尾数部分可以取任意的二进制数值f。这样,单精度数所表示的数值为: 从中我们可以发现,IEEE 754标准将一般规格化数中位于小数点后的1移到了小数点前,而且不需要用编码表示,只是在数值转换时在 公式 小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载 中加上这个1。另外,阶码代表的值需要减去127,而不是128,这也与一般移码略有不同。IEEE 754双精度数的阶码取值范围为1,2046,代码所表示的数值为: 例:将十进制数-0.75表示成单精度的IEEE 754标准代码。 解:-0.75可表示成-3/4。即二进制的-0.11。在浮点表示法中为 0 -0.11×2 在IEEE 754标准中规格化数的表示法为 -1 -1.1×2 根据IEE754的单精度表示公式 这个数可表示为 1-1 (-1)×(1+0.1000 0000 0000 0000 0000 000)×2 1126-127 =(-1)×(1+0.1000 0000 0000 0000 0000 000)×2 即 l 01111110 10000000000000000000000 例:将如下IEEE 754单精度浮点数用十进制数表示: 1 1000000l 010000000000000000000000 解:符号位s=1,阶码部分值e=129,尾数部分f=1/4=0.25,根据IEEE754标准的表示公式 1129-127 (-1)×(1+0.25)×2 2 =-l×1.25×2 =-1.25×4 =-5.0 第三节 定点数运算 定点数运算包括移位、加、减、乘、除几种。 一、移位运算 1(移位的意义 移位运算在日常生活中常见。例如15米可写作1500厘米,单就数字而言,1500相当于小数点左移了两位,并在小数点前面添了两个0;同样15也相当于1500相对于小数点右移了两位,并删去了小数点后面的两个0。可见,当某个十进制数相对于小数点左移n位时, nn相当于该数乘以10;右移n位时,相当于该数除以10。 计算机中小数点的位置是事先约定的,因此,二进制表示的机器数在相对于小数点作n n位左移或右移时,其实质就便该数乘以或除以2(n=1,2...n)。 移位运算又叫移位操作,对计算机来说,有很大的实用价值,例如,当计算机没有乘(除)运算线路时,可以采用移位和加法相结合,实现乘(除)运算。 计算机中机器数的字长往往是固定的,当机器数左移n位或右移n位时,必然会使其n位低位或n位高位出现空位。那么,对空出的空位应该添补0还是1呢,这与机器数采用有符号数还是无符号数有关,对有符号的移位叫算术移位。 2(算术移位规则 对于正数,由于[x]=[x]=[x]=真值,故移位后出现的空位均以0添之。对于负数,原补反 由于原码、补码和反码的表示形式不同,故当机器数移位时,对其空位的添补规则也不同。 下表列出了三种不同码制的机器数(整数或小数均可),分别对应正数或负数,移位后的添补规则。必须注意的是:不论是正数还是负数,移位后其符号位均不变,这是算术移位的重要特点。 不同码制机器数移位后的空位添补规则 码 制 添补代码 正数 原码、补码、反码 0 原码 0 负数 补码 左移添0 右移添1 反 码 1 由上表可得出如下结论: (1)机器数为正时,不论左移或右移,添补代码均为0。 (2)由于负数的原码其数值部分与真值相同,故在移位时只要使符号位不变,其空位均添0。 (3)由于负数的反码其各位除符号位外与负数的原码正好相反,故移位后所添的代码应与原码相反,即全部添1。 (4)分析任意负数的补码可发现,当对其由低位向高位找到第一个“1”时,在此“1”左边的各位均与对应的反码相同,而在此“1”右边的各位(包括此“1”在内)均与对应的原码相同,即添0;右移时困空位出现在高位,则添补的代码应与反码相同,即添1。 例:设机器数字长为8位(含一位符号位),若A=?26,写出三种机器数左、右移一位和两位后的表示形式及对应的真值,并分析结果的正确性。 解:(1)A=+26=(+11010) 2 则[A]=[A] =[A]=0,0011010 原补反 移位结果表示如下: 移位操作 机 器 数 对应的真值 [A]=[A]=[A] 原补反 移位前 0,0011010 +26 左移一位 0,0110100 +52 左移两位 0,1101000 +104 右移一位 0,0001101 +13 右移两位 0,0000110 +6 可见,对于正数,三种机器数移位后符号位不变,左移时最高数位丢1,结果出错;右移时最低数位丢1,影响精度。 (2)A=-26=(-11010)2 三种机器数移位结果示于下表。 移位操作 机 器 数 对应的真值 移位前 1,0011010 -26 原 左移一位 1,0110100 -52 码 左移两位 1,1101000 -104 右移一位 1,0001101 -13 右移两位 1,0000110 -6 移位前 1,1100110 -26 补 左移一位 1,1001100 -52 码 左移两位 1,0011000 -104 右移一位 1,1110011 -13 右移两位 1,1111001 -7 移位前 1,1100101 -26 反 左移一位 1,1001011 -52 码 左移两位 1,0010111 -104 右移一位 1,1110010 -13 右移两位 1,1111001 -6 可见,对于负数,三种机器数移位后符号位均不变。负数的原码左移时,高位丢1,结果出错;低位丢1,影响精度。负数的补码左移时,高位丢0,结果出错;低位丢1,影响精度。负数的反码左移时,高位丢0,结果出错;低位丢0,影响精度。 下图示意了机器中实现算术左移和右移操作的硬件框图。其中(a)真值为正的三种机器数的移位操作;(b)负数原码的移位操作;(c)负数补码的移位操作;(d)负数反码的移位操作。 3(算术移位和逻辑移位的区别 有符号数的移位称为算术移位,无符号数的移位称为逻辑移位。逻辑移位的规则是:逻辑左移时,高位移出,低位添0;逻辑右移时,低位移出,高位添0。例如,寄存器内容为01010011,逻辑左移为1010010,算术左移为00100110(最高数位“1”移丢)。又如寄存器内容为10110010,逻辑右移为01011001。若将其视为补码,算术右移为11011001。显然, 两种移位的结果是不同的。上例中为了避免算术左移时最高数位丢1,可采用带进位(C)的y移位,其示意图如下图所示。算术左移时,符号位移至C,最高数位就可避免移出。 y 二、加法与减法运算 加减法运算是计算机中最基本的运算,因减法运算可看作被减数加上一个减数的负值,即A-B=A+(-B),故在此将机器中的减法运算和加法运算合在一起讨论。现代计算机中都采用补码作加减法运算。 (补码加减运算的基本公式 1 补码加法的基本公式为: n+1 整数 [A]+[B]=[A+B] (mod 2) 补补补 小数 [A]+[B]=[A+B] (mod 2) 补补补 即补码表示肋两个数在进行加法运算时,可以把符号位与数位同等处理,只要结果不超 n+1出机器能表示的数值范围,运算后的结果按2取模(对于整数);或按2取模(对于小数),就能得到本次加法的运算结果。 对于减法因A-B=A+(-B) 则[A-B]=[A+(-B)] 补补 由补妈加法基本公式可得: n+1 整数 [A-B]=[A]+[-B] (mod 2) 补补补 [A-B]=[A]+[-B] (mod 2) 小数补补补 因此,若机器数采用补码, 当求A-B时, 只需先求[-B](称[-B]为“求补”后的减补补数),就可按补码加法规则进行运算。而[-B]由[B]连同符号位在内,每位取反,末位加补补 1而得。 例:x=0.1010,y=-0.0011,用补码的加法求x+y 解:[x]=0.1010,[y]=1.1101 补补 [x]+[y]=0.1010+1.1101=0.0111(按模2的意义,最左边的1丢掉) 补补 x+y=0.0111 例:x=0.1001,y=-0.0011,用补码的减法求x-y 解:[x]=0.1001,[y]=1.1101,[-y]=0.0011 补补补 [x]-[y]=[x]+[-y]=0.1001+0.0011=0.1100 补补补补 x-y=0.1100 例:设机器数字长为8位,其中一位为符号位,令A=-93,B=+45,求[A-B]。 补 解:由A=-93=-1011101,得[A]=1,0100011 补 由B=+45=+0101101,得[B]=0,0101101,[-B]=1,1010011 补补 [A-B]=[A]+[-B]=1,0100011+1,1010011=10,1110110 补补补 n+1 按模2的意义,最左边的“1”自然丢掉,故[A-B]=0,1110110,还原成真值得补 A-B=118,结果出错,这是因为A-B=-138超出了机器字长所能表示的范围。在计算机中,这种超出机器字长的现象,叫溢出。为此,在补码定点加减运算过程中,必须对结果是否溢出作出明确的判断。 解:由A=-93=-1011101,得[A]=1,0100011 补 2(溢出判断 补码定点加减运算判断溢出有三种方法。 (1)用一位符号位判断溢出。对于加法,只有在正数加正数和负数加负数两种情况下才可能出现溢出,符号不同的两个数相加是不会出现溢出的。对于减法,只有在正数减负数或负数减正数两种情况下才可能出现溢出,符号相同的两个数相减是不会出现溢出的。因此在判断溢出时可以根据参加运算的两个数据和结果的符号位进行;两个符号位相同的补码相加,如果和的符号位与加数的符号相反,则表明运算结果溢出;两个符号位相反的补码相减,如果差的符号位与被减数的符号位相反,则表明运算结果溢出。这种方法需要判断操作是加法还是减法,以及运算结果与操作数的符号关系。 符号不同的两个数相加不会产生溢出的原因是字长为n+1位时,数值部分为n位,数值 nn部分的最大绝对值为2。如果参加运算的两个数x和y的绝对值都小于2,则(+x)+(-y)和 n(-x)+(+y)的绝对值都不会大于2,因此只需考虑(+x)+(+y)和(-x)+(-y)的情况,这时结果z的符号应与x和y的符号相同,即当x=1且y=1时,z=0说明数据溢出;或者当x=0且0000y=0时,z=1说明数据溢出。这样可列出下表所示的判断逻辑的真值表。 00 x y z V 000 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 1 1 1 1 0 根据真值表,可得判断溢出的逻辑表达式: 这种溢出判断方法不仅需要判断加法运算的结果,而且需要保持原操作数。 (2)利用数据编码的最高位(符号位)和次高位(数值部分的最高位)的进位状况来判断运算结果是否发生了溢出。 两个补码数实现加减运算时,若最高数值位向符号位的进位值与符号位产生的进位输出值不相同,则表明加减运算产生了溢出。因为当x和y均为n+1位正整数时,其和有两种情 nn况:当x+y<2时,不会发生溢出;当x+y?2时符号位没有进位,表明发生溢出。当x和y nn都是n+1位负数时,其和也有两种情况:当x+y?-2时,不会发生溢出;当x+y<-2时,符号位相加后变成0并且有进位,而数值部分的最高位相加时无进位,结果变为正数,表明发生了溢出。减法的情况与此类似,这种判断方法的逻辑表达式如下: 例:设x=+1011, y=+1001,求[x+y]。 补 解:[x]=01011, [y]=01001 补补 [x+y]=01011+01001=10100 补 两个正数相加,最高两位的进位为01,表示发生了溢出,其结果为负数,显然是错误的。 例:设x=-1101,y=-1011,求[x+y]。 补 解:[x]=10011, [y]=10101 补补 [x+y]=10011+10101=01000 补 两个负数相加,最高两位的进位为10,表示发生了溢出,其结果为正数,显然是错误的。 (3)采用双符号位补码进行判断。正常时两个符号位的值相同,在运算结果中当两个符号位不同时则表明发生了溢出。运算结果的符号位为01表明两个正数相加,结果大于机器所能表示的最大正数,称为上溢;运算结果的符号位为10表明两个负数相加,结果小于机器所能表示的最小负数,称为下溢。也就是说,两个正数相加,数值位不应向符号位同时产生进位,使得结果数的符号位和操作数的一样,为00: 00+00+00(进位)=00 (mod 4) 两个负数相加,数值位应向符号位产生进位,使得两个负数的双符号位的运算为11; 11+11+01(进位)=11 (mod 4) 当运算结果的两个符号位不相同时,表明出现了溢出。判断溢出的逻辑表达式: 其中Z′为增加的符号位。 例:设x=+1100,y=+1000,求6位双符号位补码之和[x+y]。 补 解:[x]=001100, [y]=001000 补补 [x+y]=001100+001000=010100 补 [x+y]=010100,其中两个符号位出现01,表示已溢出。 补 例:设x=-1100,y=-1000,求6位双符号位补码之和[x+y]。 补 解:[x]=110100, [y]=111000 补补 [x+y]=110100+111000=101100 补 [x+y]=101100,其中两个符号位出现10,表示已溢出。 补 从上述例子中还看出,不论溢出与否,最高位始终指示正确的符号。采用双符号位补码后,任何小于1的正数,两个符号位都是0;任何大于-1的负数,两个符号位都是1。如果两个数相加后,其结果的符号位出现01或10时,表示发生溢出。因为两个绝对值小于1的数相加,其结果不会大于或等于2,所以最高位总是表示正确的符号。这也可以表示为:当最高数据位有进位而符号位无进位时产生上溢出;当最高数据位无进位而符号位有进位时,表示下溢出。 在双符号位补码中,正常的数据中两个符号位总是相同的,所以在存储数据时不必重复存储,只是在将数据送往运算部件进行运算时才把符号位进行复制形成双符号位补码。 3(基本的二进制加法/减法器 设加法器的输入端为x和y,进位输入端为c,结果输出端为z,进位输出端为c,iiiii+1则一位加法器的真值表如下表所示。 输入 输出 x y c c z 00ii+1i 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 1 0 1 0 1 1 1 1 1 第i位加减法电路的输入输出关系可表示为 同一套加法器电路,可以完成[x+y]和[x-y]的运算,实现过程中的差别仅表现在加法补补 时y用其原值,而减法时对y求一次补。求补的操作就是在按位求反的基础上最低位再加上1,结果得到[-y]。求补操作可以通过在输入端增加一个反相输入实现,加1操作可通过在补 最低位上设置进位输入信号为1来实现。这样改进的加法器电路ALU如下图所示。 在上图所示的具有加减法功能的电路中增加了一个信号M,用于控制加减法运算。 当M=0时得到上述相同的全加器公式: 当M=1时得到求差公式: 三、乘法运算 在计算机中,乘法运算是一种很重要的运算,有的机器由硬件乘法器直接完成乘法运算,有的机器内没有乘法器,但可以按机器作乘法运算的方法,用软件编程实现、因此,学习乘法运算方法不仅有助于乘法器的 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 ,也有助于乘法编程。 下面从分析笔算乘法入手,介绍机器中用到的几种乘法运算方法。 (1)分析笔算乘法: 设A=0.1101,B=0.1011,求A×B。 笔算乘法时乘积的符号由两数符号心算而得:正正得正;其数值部分的运算如下: 所以 A×B=+0.10001111 可见,这里包含着被乘数4的多次左移,以及四个位积的相加运算。 若计算机完全模仿笔算乘法步骤,将会有两大困难:其一,将四个位积一次相加,机器难以实现;其二,乘积位数增长了一倍,这将造成器材的浪费和运算时间的增加。为此,对笔算乘法做些改进。 (2)笔算乘法的改进: 将A•B= A•0.1011 =0.1A+0.001•A+0.0001•A =0.1A+0.00•A+0.001(A+0.1A) =0.1A+0.01[0•A+0.1(A+0.1A)] =0.1{A+0.1[0•A+0.1(A+0.1A)]} -1-1-1-1 =2{A+2 [0•A+2 (A+2A)]} -1-1-1-1 =2{A+2 [0•A+2 (A+2(A+0))]} -1 由上式可见,两数相乘的过程,可视作加法和移位(乘2相当于做一位右移)两种运算,这对计算机来说是非常容易实现的。 从初始值为0开始,对上式作分步运算,则 第一步:被乘数加零 A+0=0.1101+0.0000=0.1101 -1 第二步:右移一位,得新的部分积 2 (A+0),0.01101 -1 第三步:被乘数加部分积 A+2(A+0)=0.1101+0.01101=1.00111 -1-1 第四步:右移一位,得新的部分积 2 A+2 (A+0)=0.100111 -1-1 第五步: 0•A +2 [A+2 (A+0)] =0.100111 -1-1-1 第六步: 2{0•A+2 [A+2 (A+0)]}=0.0100111 -1-1-1 第七步: A+2{0•A+2 [A+2 (A+0)]}=1.0001111 -1-1-1-1 第八步: 2 {A+2[0•A+2 (A+2 (A+0))]}=0.10001111 上述运算过程可归纳为: ?乘法运算可用移位和加法来实现,当两个四位数相乘,总共需做四次加法和四次移位。 ?由乘数的末位值确定被乘数是否与原部分积相加,然后右移一位,形成新的部分积;同时,乘数也右移一位,由次低位作新的末位,空出最高位放部分积的最低位。 ?每次做加法时,被乘数仅仅与原部分积的高位相加,其低位被移至乘数所空出的高位位置。 计算机很容易实现这种运算规则。用一个寄存器存放被乘数,一个寄存器存放乘积的高位,又用一个寄存器存放乘数及乘积的低位,再配上加法器及其他相应电路,就可组成乘法器。又因加法只在部分积的高位进行,故不但节省了器材,而且还缩短了运算时间。 1(原码一位乘法 由于原码表示与真值极为相似,只差一个符号,而乘积的符号又可通过两数符号的逻辑异或求得,因此,上述讨论的结果可以直接用于原码一位乘,只需加上符号位处理即可。 上图是一个32位乘法器的结构框图,其中32位被乘数放在R2中,运算开始时32位乘数放在R1中,运算结束时64位乘积的高位放在R0中,低位放在R1中,R0和R1串联移位。完成这个定点原码一位乘法的运算规则可以用如下图所示的逻辑流程图表示。 在该乘法过程中,每次操作是根据乘数的一位进行操作,对于32位数的乘法,需要循环32次完成一个乘法操作,因此称为一位乘法。 例:用原码的乘法方法进行2×3的四位乘法。 解:在乘法开始之前,R0和R1中的初始值为0000和0011,R2中的值为0010。 在乘法的第一个循环中,判断R1的最低位为1,所以进入步骤1a,将R0的值加上R2的值,结果0010送人R0,然后进入第二步,将R0和R1右移一位,R0、Rl的结果为0001 0001,见下表的循环1,表中黑体字的数据位是乘法过程中判断的R1最低位。 第二个循环过程中,判断R1的最低位为l,仍进入步骤la,加0010,结果为0011,然后在第二步中将R0和R1右移一位,结果为0001 1000,见下表的循环2。 第三次循环中,因R1的最低位为0,进入步骤lb,R0不变,第二步移位后结果为00001100,见下表的循环3。 第四次循环时仍因R1最低位为0,只作移位,结果为00000110,这就是乘法的结果6,见下表的循环4。 循环 步骤 乘积(R0,R1) 0 初始值 0000 0011 1 1a:加0010 0010 0011 2:右移1位 0001 0001 2 1a:加0010 0011 0001 2:右移1位 0001 1000 3 1b:加0 0001 1000 2:右移1位 0000 1100 4 1b:加0 0000 1100 2:右移1位 0000 0110 2(原码两位乘法 原码两位乘与原码一位乘一样,符号位的运算和数值部分是分开进行的,但原码两位乘是用两位乘数的状态来决定新的部分积如何形成,因此可提高运算速度。 两位乘数共有4种状态,对应这4种状态可得下表。 乘数yy 新的部分积 n-1n 00 等于原部分积右移两位 01 等于原部分积加被乘数后右移两位 10 等于原部分积加2倍被乘数后右移两位 11 等于原部分积加3倍被乘数后右移两位 表中2倍被乘数可通过将被乘数左移一位实现,而3倍被乘数的获得可以分两步来完成,利用3=4-1,第一步先完成减1倍被乘数的操作,第二步完成加4倍被乘数的操作。而加4倍被乘数的操作实际上是由比“11”高的两位乘数代替完成的,可以看作是在高两位乘数上加“1”。这个“1”可暂时存在C触发器中。机器完成置“1” C即意味着对高两位乘数加jj 1,也即要求高两位乘数代替本两位乘数“11”来完成加4倍被乘数的操作。由此可得原码两位乘的运算规则如下表所示。 乘数判断位标志位C 操 作 内 容 j yy n-1n 00 0 z?2,y*?2,C保持“0” j 01 0 z+x*?2, y*?2,C保持“0” j 10 0 z+2x*?2, y*?2,C保持“0” j 11 0 z-x*?2, y*?2,置“1”C j 00 1 z+x*?2, y*?2,置“0”C j 01 1 z+2x*?2, y*?2,置“0”C j 10 1 z-x*?2, y*?2, C保持“1” j 11 1 z?2,y*?2,C保持“1” j 表中z表示原有部分积,x*表示被乘数的绝对值,y*表示乘数的绝对值,?2表示右移两位,当作-x*运算时,一般采用加[-x*]来实现。这样,参与原码两位乘运算的操作数是补 绝对值的补码,因此运算中右移两位的操作也必须按补码右移规则完成。尤其应注意的是,乘法过程中可能要加2倍被乘数,即+[2x*],使部分积的绝对值大于2。为此,只有对部补 分积取三位符号位,且以最高符号位作为真正的符号位,才能保证运算过程正确无误。 此外,为了统一用两位乘数和一位C共同配合管理全部操作,与原码一位乘不同的是,j 需在乘数(当乘数位数为偶数时)的最高位前增加两个0。这样,当乘数最高两个有效位出现“11”时, C需置“1”,再与所添补的两个0结合呈001状态,以完成加x*的操作(此j 步不必移位)。 例:设x=0.111111,y=-0.111001,用原码两位乘求[x• y]。 原 解:?数值部分的运算如下表所示,其中x*=0.111111, [-x*]=1.000001,2x*=1.111110, 补 y*=0.111001。 部分积 乘数y* C 说 明 j 000.000000 00111001 0 开始,部分积为0, C=0 j 000.111111 根据yyC=010加x*,保持C=0 n-1njj 000.111111 11001110 0 ?2,得新的部分积,乘数同时?2位 000.001111 根据yyC=100加2x*,保持C=0 n-1njj 001.111110 010.001101 11 0 ?2,得新的部分积,乘数同时?2位 000.100011 01110011 根据yyC=110减x*,C置“1” n-1njj 111.000001 111.100100 0111 1 ?2,得新的部分积,乘数同时?2位 111.111001 00011100 根据yyC=001加x*,C置“0” n-1njj 000.111111 000.111000 000111 形成最终结果 ?乘积的符号为 故[x• y]=1.111000000111。 原 不难理解,当乘数为偶数时,需作n/2次移位,最多作n/2+1次加法。当乘数为奇数时,乘数高位前可只增加一个“0”,此时需作n/2+1次加法,n/2+1次移位(最后一步移一位)。 虽然两位乘法可提高乘法速度,但它仍基于重复相加和移位的思想,而且随着乘数位数的增加,重复次数增多,仍然影响乘法速度的进一步提高。采用并行阵列乘法器可大大提高乘法速度。 原码乘法实现比较容易,但由于机器都采用补码作加减运算,倘若做乘法前再将补码转换成原码,相乘之后又要将负积的原码变为补码形式,这样增添了许多操作步骤,反而使运算复杂。为此,有不少机器直接用补码相乘,机器里配置实现补码乘法的乘法器,避免了码制的转换,提高了机器效率。 3(补码一位乘法 一种比较好的带符号数乘法的方法是布斯(Booth)算法。它采用相加和相减的操作计算补码数据的乘积。Booth算法对乘数从低位开始判断,根据两个数据位的情况决定进行加法、减法还是仅仅移位操作。判断的两个数据位为当前位及其右边的位(初始时需要增加一个辅助位0),移位操作是向右移动。在上例中,第一次判断被乘数0110中的最低位0以及右边的位(辅助位0),得00;所以只进行移位操作;第二次判断0110中的低两位,得10,所以作减法操作并移位,这个减法操作相当于减去2a的值;第三次判断被乘数的中间两位,得11,于是只作移位操作;第四次判断0110中的最高两位,得01,于是作加法操作和移位,这个加法相当于加上8a的值,因为a的值已经左移了三次。 一般而言,设y=y,yy„y为被乘数,x为乘数,y是a中的第i位(当前位)。根据y0l2nij与y的值,Booth算法表示如下表所示,其操作流程如下图所示。在Booth算法中,操作i+1 的方式取决于表达式(y-y)的值,这个表达式的值所代表的操作为: i+1i 0 无操作 +1 加x -1 减x Booth算法操作表示 y y 操作 说明 ii+1 0 0 无 处于0串中,不需要操作 0 1 加x 1串的结尾 1 0 减x 1串的开始 1 1 无 处于1串中,不需要操作 实现32位Booth乘法算法的流程图 乘法过程中,被乘数相对于乘积的左移操作可表示为乘以2,每次循环中的运算可表示 31-i为对于x(y-y)2项的加法运算(i=3l,30,„,1,0)。这样,Booth算法所计算的结果 可i+1i 表示为: 0 x×(0-y)×2 31 1 +x×(y-y)×2 3130 2 +x×(y-y)×2 3029 „ 31 +x×(y-y)×2 10 3130290 =x×(-y×2 +y×2 +y×2+y×2) 01231 =x×y 例:用Booth算法计算2×(-3)。 解:[2]=0010, [-3]=1101,在乘法开始之前,R0和R1中的初始值为0000和1101,补补 R2中的值为0010。 在乘法的第一个循环中,判断R1的最低位和辅助位为10,所以进入步骤1c,将R0的值减去R2的值,结果1110送人R0,然后进人第二步,将R0和Rl右移一位,R0和R1的结果为11110110,辅助位为l。 在第二个循环中,首先判断Rl的最低位和辅助位为0l,所以进入步骤1b,作加法,R0+R2=1111+0010,结果0001送入R0,这时R0R1的内容为0001 0110,在第二步右移后变为0000 1011,辅助位为0。 在第三次循环中,判断位为10,进入步骤lc,R0减去R2,结果1110送入R0,R1不变;步骤2移位后R0和R1的内容为1111 01011,辅助位为1。 第四次循环时,因两个判断位为11,所以不作加减运算,向右移位后的结果为1111 1010,这就是运算结果(—6)。 这个乘法的过程描述如下表所示,表中乘积一栏表示的是R0、R1的内容以及一个辅助位P,黑体字表示对两个判断位的判断。 用Booth补码一位乘法计算2 ×(-3)的过程 循环 步骤 乘积(R0,R1, P) 初始值 0000 1101 0 0 1c:减0010 1110 1101 0 1 2:右移1位 1111 0110 1 1b:加0010 0001 0110 1 2 2:右移1位 0000 1011 0 1c:减0010 1110 1011 0 3 2:右移1位 1111 0101 1 1a:无操作 1111 0101 1 4 2:右移1位 1111 1010 1 4(补码两位乘 补码两位乘运算规则是根据补码一位乘的规则,把比较yy的状态应执行的操作和比ii+1 较yy 的状态应执行的操作合并成一步,便可得出补码两位乘的运算方法。 i-1i 补码两位乘法运算规则如下 判断位yyy 操作内容 i-1 ii+1 -2[z]=2[z] 000 i+1补i补 -2001 [z]=2{[z]+[x]} i+1补i补补 -2]=2{[z]+[x]} [z010 i+1补i补补 -2011 [z]=2{[z]+2[x]} i+1补i补补 -2[z]=2{[z]+2[-x]} 100 i+1补i补补 -2101 [z]=2{[z]+ [-x]} i+1补i补补 -2[z]=2{[z]+-x}} 110 i+1补i补补 -2111 [z]=2[z] i+1补i补 由上表可见,操作中出现加2[x]和加2[-x],故除右移两位的操作外,还有被乘数左补补 ,都可能因溢出而侵占双符号位,故部分积和被乘数移一位的操作;而加2[x]和加2[-x]补补 采用三位符号位。 例:[x]=0.0101,[y]=1.0101 求: [x• y]。 补补补 解:求解过程如下表所示。其中乘数取两位符号位即11.0101,[-x]=1.1011取三符号补位为111.1011。 部分积 乘数 说 明 000.0000 1101010 判断位为010,加[x] 补 + 000.0101 000.0101 0111010 ?2位 000.0001 判断位为010,加[x] 补 + 000.0101 000.0110 01 ?2位 000.0001 1001110 判断位为110,加[-x] 补 + 111.1011 111.1100 1001 最后一步不移位,得[x• y] 补 故[x• y]=1.11001001 补 可见,与补码一位乘相比,补码两位乘的部分积多取一位符号位(共3位),乘数也多取一位符号位(共2位),这是由于乘数每次右移2位,且用3位判断,故采用双符号位更便于硬件实现。可见,当乘数数值位为偶数时,乘数取2位符号位,共需作n/2次移位,最多作n/2+1次加法,最后一步不移位;当n为奇数时,可补0变为偶数位,以简化逻辑操作。也可对乘数取1位符号位,此时共作n/2+1次加法和n/2+1次移位(最后一步移一位)。 对于整数补码乘法,其过程与小数乘法完全相同。为了区别于小数乘法,在书写上可将符号位和数值位中间的“.”改为“,”即可。 四、除法运算 1(分析笔算除法 以小数为例,设 x=-0.1011,y=0.1101,求x/y 笔算除法时,商的符号心算而得:负正得负;其数值部分的运算如下面竖式。 所以商x/y=0.1101,余数=-0.00000111 其特点可归纳如下: ?每次上商都是由心算来比较余数(被除数)和除数的大小,确定商为1还是0。 ?每做一次减法,总是保持余数不动,低位补0,再减去右移后的除数。 ?商符单独处理。如果将上述规则完全照搬到计算机内,实现起来有一定困难,主要问题是: a(机器不能“心算”上商,必须通过比较被除数(或余数)和除数绝对值的大小来确定商值,即|x|-|y|,若差为正(够减)上商1,差为负(不够减)上商0。 b(按照每次减法总是保持余数不动低位补0,再减去右移后的除数这一规则,则要求加法器的位数必须为除数的两倍。仔细分析发现,右移除数可以用左移余数的办法代替,其运算结果是一样的,但对线路结构更有利。不过此刻所得到的余数不是真正的余数,只有将 -n它乘上2才是真正的余数。 c(笔算求商时是从高位向低位逐位求的,而要求机器把每位商直接写到寄存器的不同位也是不可取的。计算机可将每一位商直接写到寄存器的最低位,并把原来的部分商左移一位。 综上所述便可得原码除法运算规则。 2(原码除法: 原码除法和原码乘法一样,符号位是单独处理的。以小数为例: 设 式中为x的绝对值,记作x* 为y的绝对值,记作y* 即商符由两数符号位“异或”运算求得,商值由两数绝对值相除(x*/y*)求得。 小数定点除法对被除数和除数有一定的约束,即必须满足下列条件: 0,|被除数|?|除数| 实现除法运算时,还应避免除数为0或被除数为0。前者结果为无限大,不能用机器的有限位数表示;后者结果总是0,这个除法操作等于白做,浪费了机器时间。至于商的位数一般与操作数的位数相同。 原码除法中由于对余数的处理不同,又可分为恢复余数法和不恢复余数法(加减交替法)两种。 (1)恢复余数法。恢复余数法的特点是:当余数为负时,需加上除数,将其恢复成原来的余数。 由上所述,商值的确定是通过比较被除数和除数的绝对值大小,即x*-y*实现的, 而计算机内只设加法器, 故需将x*-y*操作变为[x*]+[-y*]的操作。 补补 例:已知:x=-0.1011,y=-0.1101,求:[x?y] 原 解:由x*=0.1011,[x]=1.1011 原 y*=0.1101,[-y]=1.0011,[y]=1.1101 补原 商值的求解过程如下: 被除数(余数) 商 说 明 0.1011 0.0000 +[-y*](减去除数) 补 + 1.0011 1.1110 0 余数为负,上商0 + 0.1101 恢复余数+[y*] 补 0.1011 被恢复的被除数 0 1.0110 ? 1位 + 1.0011 +[-y*](减去除数) 补 0.1001 01 余数为正,上商1 1.0010 01 ? 1位 + 1.0011 +[-y*](减去除数) 补 0.0101 011 余数为正,上商1 0.1010 011 ? 1位 +1.0011 +[-y*](减去除数) 补 1.1101 0110 余数为负,上商0 + 0.1101 恢复余数+[y*] 补 0.1010 0110 被恢复的被除数 1.0100 ? 1位 + 1.0011 +[-y*](减去除数) 补 0.0111 01101 余数为正,上商1 故商值为0.1101 商的符号位为 由此可见,共上商5次,第一次上的商在商的整数位上,这对小数除法而言,可用它作 溢出判断。即当该位为“1”时,表示此除法为溢出,不能进行,应由程序进行处理;当该 位为“0”时,说明除法合法,可以进行。 在恢复余数法中,每当余数为负时,都需恢复余数,这变延长了机器除法的时间,操作 也很不规则,对线路结构不利。加减交替法可克服这些缺点。 (2)加减交替法。加减交替法又称不恢复余数法,可以认为它是恢复余数法的一种改 进算法。 分析原码恢复余数法得知: 当余数Ri>0时,可上商“1”,再对Ri左移一位后减除数,即2R-y*。 i 当余数Ri>0时,可上商“0”,然后再做R+y*,即完成恢复余数的运算,再做i 2(R+y*)-y*,也即2R+y*。 ii 可见,原码恢复余数法可归纳为: 当余数Ri>0时,商上“1”,做2R-y*的运算; i 当余数Ri<0时,商上“0”,做2R+y*的运算。 i 这里已看不出余数的恢复问题了,而只是做加y*或减y*,因此,一般把它叫做加减交 替法或不恢复余数法。 例:已知:x=-0.1011,y=-0.1101,求:[x? y] 原 解:[x]=1.1011, x*=0.1011 原 [y]=0.1101, y*=0.1101, [-y*]=1.0011 原补 商值的求解过程如下表所示: 被除数(余数) 商 说 明 0.1011 0.0000 +[-y*](减除数) 补 + 1.0011 1.1110 0 余数为负,上商0 1.1100 0 ? 1位 + 0.1101 +[y*](加除数) 补 0.1001 余数为正,上商1 01 01 1.0010 ? 1位 + 1.0011 +[-y*](减除数) 补 0.0101 011 余数为正,上商1 0.1010 011 ? 1位 + 1.0011 +[-y*](减除数) 补 1.1101 0110 余数为负,上商0 1.1010 0110 ? 1位 + 0.1101 +[y*](加除数) 补 0.0111 01101 余数为正,上商1 商的符号位为 所以 分析此例可见,n位小数的除法共上商n+1次,第一次商用来判断是否溢出。倘若比例因子选择恰当,除数结果不溢出,则第一次商肯定是0。如果省去这位商,只需上商n次即可,此时除法运算一开始应将被除数左移一位减去除数,然后再根据余数上商。 (3)原码加减交替法所需的硬件配置。下图是实现原码加减交替除法运算的基本硬件配置框图。 图中A、X、Q均为n+1位寄存器,其中A存放被除数的原码,X存放除数的原码。移位和加控制逻辑受Q的末位Qn控制。(Qn=1作减法,Qn=0作加法),计数器C用于控制逐位相除的次数n,G为除法标记,V为溢出标记,S为商符。 D (4)原码加减交替除法控制流程。下图为原码加减交替除法控制流程图。 除法开始前,Q寄存器被清0,准备接收商,被除数的原码放在A中,除数的原码放在X中,计数器C中存放除数的位数n。除法开始后,首先通过异或运算求出商符,并存于S。接着将被除数和除数变为绝对值,然后开始用第一次上商判断是否溢出。若溢出,则置溢出标记V为1,停止运算,进行中断处理,重新选择比例因子:若无溢出,则先上商,接着A、Q同时左移一位,然后再根据上一次商值的状态,决定是加还是减除数,这样重复n次后,再上最后一次商(共上商n+1次),即得运算结果。 对于整数除法,要求满足以下条件: 0<|除数|?|被除数| 因为这样才能得到整数商。通常在做整数除法前,先要对这个条件进行判断,若不满足上述条件,机器发出出错信号,程序要重新设定比例因子。 上述讨论的小数除法完全适用于整数除法,只是整数除法的被除数位数可以是除数的两倍,且要求被除数的高M位要比除数(n位)小,否则即为溢出。如果被除数和除数的位数都是单字长,则要在被除数前面加上一个字的0,从而扩展成双倍字长再进行运算。 3(补码除法 与补码乘法类似,也可以用补码完成除法操作。补码除法也分恢复余数法和加减交替法,后者用得较多,在此只讨论加减交替法。 (1)补码加减交替法运算规则。补码除法其符号位和数值部分是一起参加运算的,因此在算法上不像原码除法那样直观,主要需解决三个问题:第一,如何确定商值;第二,如何形成商符;第三,如何获得新的余数。 ?商值的确定。欲确定商值,必须先比较被除数和除数的大小,然后才能求得商值。 a( 比较被除数(余数)和除数的大小。补码除法的操作数均为补码,其符号又是任意的,因此要比较被除数[x]和除数[y]的大小就不能简单地用[x]减去[y]。实质上比较[x]补补补补补和[y]的大小就是比较它们所对应的绝对值的大小。同样在求商的过程中,比较余数[R]补i补与除数[y]的大小,也是比较它们所对应的绝对值。这种比较的算法可归纳为以下两点: 补 第一,当被除数与除数同号时,做减法,若得到的余数与除数同号,表示“够减”,否则表示“不够减”。 第二,当被除数与除数异号时,做加法,若得到的余数与除数异号,表示“够减”,否则表示“不够减”。 此算法如下表所示。 比较[x]与[y]的符求余数 比较 [R]与[y]的符补补i补补 号 号 [x]-[y]同号,表示“够减” 同号 补 补 [x]+[y]异号,表示“够减” 异号 补 补 b(商值的确定。补码除法的商也是用补码表示的,如果我们约定商的末位用“恒置1”的舍入规则,那么除末位商外,其余各位的商值对正商和负商而言,上商规则是不同的。因为在负商的情况下,除末位商以外,其余任何一位的商与真值都正好相反。因此,上商的算法可归纳为以下两点: 第一,如果[x]与[y]同号,商为正,则“够减”时上商“1”。“不够减”时上商补补 “0”(按原码规则上商)。 第二,如果[x]与[y]异号,商为负,则“够减”时上商“0”,“不够减”时上商补补 “1”(按反码规则上商)。 结合比较规则与上商规则,使可得商值的确定办法,如下表所示。 [x]与[y] 商值 商 [R]与[y] 补补补补 同号 正 同号,表示“够减” 1 异号,表示“不够减” 0 异号 负 异号,表示“够减” 0 同号,表示“不够减” 1 进一步简化,商值可直接由下表确定。 [x]与[y] 商值 补补 同号 1 异号 0 ?商符的形成。在补码除法中,商符是在求商的过程中自动形成的。 在小数定点除法中,被除数的绝对值必须小于除数的绝对值,否则商大于1而溢出。因此,当[x]与[y]同号时,[x]-[y]所得的余数[R]与[y]异号,商上“0”,恰好与补补补补0补补 正)一致;当[x]与[y]异号时,[x]+[y]所得的余数[R]与[y]同号,商上商的符号(补补补补0补补“1”,这也与商的符号(负)一致。可见,商符是在求商值过程中自动形成的。 此外,商的符号还可用来判断商是否溢出。例如,当[x]与[y]同号时,若[R]与[y]补补0补同号,上商“l”,即溢出。当[x]与[y]异号时,若[R]与[y]异号,上商“0”,即溢补补补补0补 出。 当然,对于小数补码运算,商等于“-1”应该是允许的,但这需要特殊处理,为简化问 题,这里不予考虑。 ?新余数[R]的获得。 i+1补 新余数[R]的获得方法与原码加减交替法极相似,其算法规则为: i+1补 当[R]与[y]同号时,商上“l”,新余数 0补补 [R]=2[R]-[y]=2[R]+[-y] i+1补i补补i补补 当[R]与[y]异号时,商上“0”,新余数 0补补 [R]=2[R]+[y] i+1补i补补 将此法列于下表: [R]与[y] 商 新余数[R] 补补i+1补 同号 1 [R]=2[R]+[-y] i+1补i补补 异号 0 [R]=2[R]+[y] i+1补i补补 如果对商的精度没有特殊要求,一般可采用“末位恒置1”法,这种方法操作简单,易 -n于实现,而且最大误差仅为2。 例:已知:x=-0.1001, y=+0.1101 求: [x?y] 补 解:[x]=1.0111,[y]=0.1101,[-y]=1.0011 补补补 运算过程如下: 被除数(余数) 商 上商 说 明 1.0111 0.0000 [x]与[y]异号,+[y] 补补补 + 0.1101 0.0100 1 [R]与[y]同号,上商1 补补 0.1000 1 ? 1位 + 1.0011 +[-y] 补 1.1011 10 [R]与[y]异号,上商0 补补 1.0110 10 ? 1位 + 0.1101 +[y] 补 0.0011 101 [R]与[y]同号,上商1 补补 0.0110 101 ? 1位 + 1.0011 +[-y] 补 1.1001 1010 [R]与[y]异号,上商0 补补 1.0010 10101 ? 1位,末位商恒置“1” 所以[x?y]=1.0101 补 (2)补码加减交替法所需的硬件配置。补码加减交替法所需的硬件配置基本上与原码加 减交替法所需的硬件配置相似。 (3)补码加减交替法的控制流程。 上图示出了补码加减交替除法的控制流程。 除法开始前,Q寄存器被清0,准备接收商,被除数的补码在A中,除数的补码在x中,计数器C中存放除数的位数M。除法开始后,首先根据两操作数的符号确定是作加法还是减法,加(或减)操作后,即上第一次商(商符),然后A、Q同时左移一位,再根据商值的状态决定加或减除数,这样重复”次后,再上一次末位商“1”(恒置“1”法),即得运算结果。 补充说明几点: ?图中未画出补码除法溢出判断的内容;?按流程图所示,多作一次加(或减)法,其实末位恒置“1”前,只需移位不必作加(或减)法;?与原码除一样,图中均未指出对0进行检测,实际上在除法运算前,先检测被除数和除数是否为0,若被除数为0,结果即为0;若除数为0,结果为无穷大,这两种情况都无需继续作除法运算;?为了节省时间,上商和移位操作可以同时进行。 第四节 浮点数四则运算 机器中任何一个浮点数可写成 的形式,其中,为浮点数的尾数,一般为绝对值小于1的规格化数(补码表示时允许为-1),x 机器中可用原码或补码表示;j为浮点数的阶码,一般为整数,机器中大多用补码或移码表x 示。r为浮点数的基数,常用2、4、8或16表示。以下以基数为2进行讨论。 一、浮点加减运算 设两个浮点数 由于浮点数尾数的小数点均固定在第一数值位前,尾数的加减运算规则与定点数完全相同。但由于其阶码的大小又直接反映尾数有效值的小数点位置,因此当两浮点数阶码不等时,因两尾数小数点的实际位置不一样,尾数部分无法直接进行加减运算。因此,浮点数加减运算必须按以下n步进行: ?对阶,使两数的小数点位置对齐。 ?尾数求和,将对阶后的两尾数按定点加减运算规则求和(差)。 ?规格化,为增加有效数字的位数,提高运算精度,必须将求和(差)后的尾数规格化。 ?舍入,为提高精度,要考虑尾数右移时丢失的数值位。 ?判断结果,即判断结果是否溢出。 1(对阶 对阶的目的是使两操作数的小数点位置对齐,即使两数的阶码相等。为此,首先要求出阶差,再按小阶向大阶看齐的原则,使阶小的尾数向右移位,每右移一位,阶码加1,直到两数的阶码相等为止。右移的次数正好等于阶差。尾数右移时可能会发生数码丢失,影响精度。 0111 例如,两浮点数x,0.1101×2,y=(-0.1010)×2,求x+y。 首先写出x,y在计算机中的补码表示。 [x]=00,01;00.1101,[y]=00,11;11.0110 补补 在进行加法前,必须先对阶,故先求阶差: [Δj]=[j]-[j]=00,01+11,01=11,10 补x补y补 即Δj=-2,表示x的阶码比y的阶码小,再按小阶向大阶看齐的原则,将x的尾数右移两位,其阶码加2。 得[xˊ]=00,11;00,0011 补 此时,Δj=0,表示对阶完毕。 2(尾数求和 将对阶后的两个尾数按定点加(减)运算规则进行运算。 如上例中的两数对阶后得: [xˊ]=00,11;00.0011 补 [y]=00,11;11.0110 补 则[S+S]=00.0011+11.0110=11.1001 xy补 即[x+y]=00,11;11.1001 补 3(规格化 由第二章可知,尾数S的规格化形式为 如果采用双符号位的补码,则 当S>0时,其补码规格化形式为 [S]=00.1××„× 补 当S<0时,其补码规格化形式为 [S]=11.0××„× 补 可见,当尾数的最高数值位与符号位不同时,即为规格化形式,但对S<0时,有两种情 况需特殊处理。 ?S=-1/2,则[S]=11.100„0。对于补码而言,它不满足于上面的规格化表示式。为了补 便于硬件判断,特规定-1/2是规格化的数(对补码而言)。 ?S=-1,则[S]=11.000„0。因小数补码允许表示-1,故-1视为规格化的数。 补 当尾数求和(差)结果不满足上面两式时,则需规格化。 规格化又分左规和右规两种。 (1)左规。当尾数出现00.0×ׄ×或11.1×ׄ×时,需左规。左规时尾数左移一位, 阶码减1,直到符合补码规格化表示式为止。 如上例求和结果为6 [x+y]=00,11;11.1001 补 尾数的第一数值位与符号位相同,需左规,即将其左移一位,同时阶码减1,得[x+y]补=00,10;11.0010。 (2)右规。当尾数出现01.×ׄ×或10.×ׄ×时,表示尾数溢出,这在定点加减运算中是不允许的,但在浮点运算中这不算溢出,可通过右规处理。右规时尾数右移一位,阶码加1。 4(舍入 在对阶和右规的过程中,可能会将尾数的低位丢失,引起误差,影响了精度,为此可用舍入法来提高尾数的精度。常用的舍入方法有三种。 (1)截去法。将多余的位截去,剩下的位不变。其最大误差接近于数据最低位上的1。 特点:有舍无入,具有误差积累。 (2)“0舍1入”法。“0舍1入”法类似于十进制运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样做可能使尾数又溢出,此时需再做一次右规。 其最大误差是最低位上的-1/2到接近于1/2之间,正误差可以和负误差抵消。是比较理想的方法,但实现起来比较复杂。 (3)“恒置1”法。尾数右移时,不论丢掉的最高数值位是“1”或“0”,都使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。 特点:尽管误差范围扩大了,但正负误差可以相互抵消,从统计角度,平均误差为0。因此最后运算结果的准确性提高了。 综上所述,浮点加减运算经过对阶、尾数求和、规格化和舍入等步骤。与定点加减运算相比,显然要复杂得多。 -101-100 例:设x=2×(-0.101000),y=2×(+0.111011),并假设阶符取2位,阶码取3位,数符取2位,尾数取6位,求x-y。 -101-100 解:由x=2×(-0.101000),y=2×(+0.111011) 得[x]=11,011;11.011000,[y]=11,100;00.111011 补补 ?对阶 [Δ]=[j]-[j]=11,011+00,100=11,111 j补x补y补 即Δ=-1,则x的尾数向右移一位,阶码相应加1,即 j [x]ˊ=11,100;11.101100 补 ?求和 [S]ˊ-[S]=[S]+[-S] x补y补x补y补 =11.101100+11.000101 =10.110001 即 [x-y]=11,100;10.110001 补 尾数符号位出现“10”,需右规。 ?规格化 右规后得 [x-y]=11,101;11.0110001 补 ?舍入处理 采用0舍1入法,其尾数右规时末位丢1,则 [x-y]=11,101;11.011001 补 ?溢出判断 -011 经舍入处理后阶符为“11”,不溢出,故最终结果: x-y= 2×(-0.100111) 5(溢出判断 与定点加减法一样,浮点加减运算最后一步也要判溢出。在浮点规格化中已指出,当尾数之和(差)出现01.×ׄ×或10.×ׄ×时,并不表示溢出,只有将此数右规后,再根据阶码来判断浮点运算结果是否溢出。 若机器数为补码,尾数为规格化形式,并假设阶符取2位,阶码取7位,数符取2位,尾数取n位,则它们能表示的补码在数轴上的表示范围如下图。 图中A、B、a、b的坐标均为补码表示,分别对应最小负数、最大正数、最大负数和最小正数。它们所对应的真值分别是: +127 A最小负数 2×(-1) +127-n B最大正数 2×(1-2) -128-1-n a最大负数 2×(-2-2) -128-1 b最小正数 2×2 上图中a、b之间的阴影部分,对应阶码小于-128的情况,叫做浮点数的下溢。下溢时,浮点数值趋于零,故机器不做溢出处理,仅把它作为机器零。 上图的A、B两侧阴影部分,对应阶码大于+127的情况,叫做浮点数的上溢。此刻,浮点数真正溢出,机器需停止运算,作溢出中断处理。一般说浮点溢出,均是指上溢。 可见,浮点机的溢出与否可由阶码的符号决定。即 阶码[j]=01,×ׄ×为上溢。 补 阶码[j]=10,×ׄ×为下溢,按机器零处理。 补 当阶符为“01”时,需做溢出处理。 6(浮点数加减运算流程 二、浮点乘除法运算 两个浮点数相乘,其乘积的阶码应为相乘两数的阶码之和,其乘积的尾数应为相乘两数的尾数之积。两个浮点数相除,商的阶码为被除数的阶码减去除数的阶码,其尾数为被除数的尾数除以除数的尾数所得的商。可用下式描述。 设两浮点数 则 在运算中也要考虑规格化和舍入问题。 1(阶码运算 若阶码用补码运算,乘积的阶码为[j]+[j],商的阶码为[j]-[j],两个同号的x补y补x补y补阶码相加或异号的阶码相减可能产生溢出,此时应作溢出判断。 若阶码用移码运算,则 nnn 因为[j]=2+ j -2?j <2 (n为整数的位数) x移xx nnn [j]=2+ j -2?j<2 (n为整数的位数) y移yy nnnn 所以[j]+[j]= 2+ j +2+ j = 2+ (2 +( j + j)) x移y移xyxy n = 2+[j + j] xy移 n 可见,直接用移码求阶码和时,其最高位多加了一个2,要得到移码形式的结果,必须 n减去2。 由于同一个真值的移码和补码其数值部分完全相同,而符号位正好相反,即 n+1n+1 [j]=2+ j (mod 2) y补y 因此如果求阶码和可用下式完成: nn+1 [j]+[j]= 2+ j +2+ j x移y补xy nn = 2+ [2 +( j + j)] xy n+1 = [j + j](mod 2) xy移 则直接可得移码形式。 同理,当作除法运算时,商的阶码可用下式完成: [j]+[-j] = [j - j] x移y补xy移 可见进行移码加减运算时,只需将移码表示的加数或减数的符号位取反(即变为补码),然后进行运算,就可得阶和(或阶差)的移码。 阶码采用移码表示后又如何判断溢出呢,如果在原有移码符号位的前面(即高位)再增 加位符号位,并规定该位恒用“0”表示,便能方便地进行溢出判断。溢出的条件是运算结果移码的最高符号位为1;此时若低位符号位为0,表示上溢;低位符号位为1,表示下溢。如果运算结果移码的最高符号位为0,即表明没溢出。此时若低位符号位为1,表明结果为正:低位符号位为0,表示结果为负。 2(尾数运算 (1)浮点乘法尾数运算。两个浮点数的尾数相乘,可按下列步骤进行: ?检测两个尾数中是否有一个为0,若有一个为0,乘积必为0,不再作其他操作;如果两尾数均不为0,则可进行乘法运算。 ?两个浮点数的尾数相乘可以采用定点小数的任何一种乘法运算来完成。相乘结果可能要进行左规,左规时调整阶码后如果发生阶下溢,则作机器零处理;如果发生阶上溢,则作溢出处理。此外,尾数相乘会得到一个双倍字长的结果,若限定只取1倍字长,则乘积的若干低位将会丢失。如何处理丢失的各位值,通常有两种办法。 其一,无条件的丢掉正常尾数最低位之后的全部数值,这种办法被称为截断处理,其优点是处理简单,但影响精度。 其二,按浮点加减运算讨论的舍入原则进行舍入处理。对于原码,采用0舍1入法时,不论其值是正数或负数,“舍”使数的绝对值变小,“入”使数的绝对值变大。对于补码,采用0舍1入法时,若丢失的位不是全0,对正数来说,“舍”、“入”的结果与原码分析正好相同;对负数来说,“舍”、“入”的结果与原码分析正好相反,(即“舍”使绝对值变大,“入”使绝对值变小。 为了使原码、补码舍入处理后的结果相同,对负数的补码可采用如下规则进行舍入处理。 ?当丢失的各位均为0时,不必舍入; ?当丢失的各位数中的最高位为0时,且以下各位不全为0;或丢失的各位数中的最商位为3,且以下各位均为0时,则舍去被丢失的各位; ?当丢失的各位数中的最高位为1,且以下各位又不全为0时;则在保留尾数的最末位加1修正。 下面举例说明浮点乘法运算的全过程。 设机器数阶码取3位(不含阶符),尾数取7位(不舍数符),要求阶码用移码运算,尾数用补码运算,最后结果保留1倍字长。 -101011 例: x=2×0.0110011),y=2×(-0.1110010) 求: x• y 解:[x]=11,011;00.0110011 补 [y]=00,011;11.0001110 补 ?阶码运算 [j]=00,011, [j]=00,011 x移y补 [j+j]=[j]+[j]=00,011+00,011 xy移x移y补 =00,110 对应真值-2 ?尾数相乘(采用Booth算法)其过程如下表所示。 y 部分积 乘 数 说 明 n+1 1.0001110 0 ?1位 00.0000000 00.0000000 0.1000111 0 +[-S] x补 + 11.1001101 11.1001101 0 ?1位 1 11.1100110 10100011 ?1位 1 11.1110011 01010001 ?1位 11.1111001 10101000 +[S] x补 + 00.0110011 00.0101100 1010 0 ?1位 00.001011 01010100 0 ?1位 00.0001011 00101010 0 ?1位+ 00.0000101 10010101 [-S] x补 + 11.1001101 11.1010010 1001010 相乘的结果为:[S•S]=11.10100101001010 xy补 即[x•y]=11,110;11.10100101001010 补 ? 规格化。左规后[x•y]=11,101;11.01001010010100 补 ?舍入处理。尾数为负,按负数的补码的舍入规则,取1倍字长,丢失的7位为0010100, 应“舍”,故最终的结果为: [x•y]=11,101;11.0100101 补 -011 xy= 2×(-0.1011011) (2)浮点除法尾数运算。两个浮点数的尾数相除,可按下列步骤进行: ?检测被除数是否为0,若为0,则商为0;再检测除数是否为0,若为0,则商为无穷大,另作处理。若两数均不为0,则可进行除法运算。 ?两浮点数尾数相除同样可采取定点小数的任何—种除法运算来完成。对已规格化的尾 数,为了防止除法结果溢出,可先比较被除数和除数的绝对值,如果被除数的绝对值大于除数的绝对值,则先将被除数右移一位,其阶码加1,再作尾数相除。此时所得结果必然是规格化的定点小数。 101011 例: x=2×0.1001,y=2×(-0.1101),按补码浮点运算方法求x?y 解:[x]=00,101;00.1001, [y]=00,011;11.0011,[-S]=00.1101 补补y补 ?阶码相减。 [j]-[j]=00,101-00,011=00,101+11,101=00,010 x补y补 ?尾数相除(采用补码除法)。其过程如下表所示。 被除数(余数) 商 说 明 00.1001 [S]与[S]异号,+[S] x补y 补y补 + 11.0011 11.1100 1 [R]与[S]同号,上商1 补y 补 11.1000 1 ?1位 + 00.1101 +[-S] y补 00.0101 10 [R]与[S]异号,上商0 补y 补 00.1010 10 ?1位 11.0011 +[S] y补 11.1101 101 [R]与[S]同号,上商1 补y 补 11.1010 101 ?1位 + 00.1101 +[-S] y补 00.0111 1010 [R]与[S]异号,上商0 补y 补 + 00.1110 10101 ?1位,末位商恒置1 结果为[S?S]=1.0101 xy ?规格化。尾数相除结果已为规格化数。 所以[x?y]=00,010;11.0101 补 010 则[x?y]=2×(-0.1011) 三、浮点运算所需的硬件配置 由于浮点运算分阶码和尾数两部分,因此浮点运算器的硬件配置比定点运算器复杂。分析浮点四则运算发现,对于阶码只有加减运算,对于尾数则有加、减、乘、除四种运算。可见浮点运算器主要由两个定点运算部件组成,一个是阶码运算部件,用来完成阶码加、减,以及控制对阶码、阶的尾数右移次数和规格化时对阶码的调整;另一个是尾数运算部件,用来完成尾数的四则运算以及判断尾数是否已规格化,此外,还需有判断运算结果是否溢出的电路等。 现代计算机可把浮点运算部件做成独立的选件,或叫协处理器,用户可根据需要选择,不用选件的机器,也可用编程的办法来完成浮点运算,不过这将会影响机器的运算速度。 例如,Inte l80287是浮点协处理器,它可与Intel 80286或80386微处理器配合处理浮点数的算术运算和多种函数计算。 第五节 算术逻辑单元 针对每一种算术运算,都必须有一个相对应的基本硬件配置,其核心部件是加法器和寄存器。当需完成逻辑运算时,势必需要配置相应的逻辑电路, 而ALU电路是既能完成算术运算又能完成逻辑运算的部件。 一、ALU电路 下图是ALU框图。图中A和B为输入变量;K为控制信号,K的不同取值可决定该电iiii 路作哪一种算术运算或哪一种逻辑运算;F是输出函数。 i 现在ALU电路已制成集成电路芯片,如74181是能完成四位二进制代码的算逻运算部件,其外特性如下图所示。 74181有两种工作方式:正逻辑和负逻辑。下表列出其算术/逻辑运算功能。 以正逻辑为例,B,B和A,A是两个操作数,F,F为输出结果。C表示最低位的外303030-l来进位,C是7418l向高位的进位;P、G可供先行进位使用。M用于区别算术运算还是逻n+4 辑运算;S,S的不同取值可实现不同的运算。例如,当M=1,S,S=0110时,74181作逻3030 辑运算A?B;当M=0,S,S=0110时,74181作算术运算。由上表可见,在正逻辑条件下,30 M=0,S,S=0110,且C=1时,完成A减B减1的操作。若想完成A减B运算,可使C=0。30-l-l需注意,74181算术运算是用补码实现的,其中减数的反码是由内部电路形成的,而末位加“1”,则通过C=0来体现。尤其要注意的是,ALU为组合逻辑电路,因此实际应用ALU时,-l 其输入端口A和B必须与锁存器相连,而且在运算的过程中锁存器的内容是不变的。其输出也必须送至寄存器中保存。 二、快速进位链 随着操作数位数的增加,电路中进位的速度对运算时间的影响也越大,为了提高运算速度,本节将通过对进位过程的分析设计快速进位链。 1(并行加法器 并行加法器由若干个全加器组成,如下图所示。n+1个全加器级联,就组成了一个n+1位的并行加法器。 由于每位全加器的进位输出是高一位全加器的进位输入,因此当全加器有进位时,这种一级一级传递进位的过程,将会大大影响运算速度。 由全加器的逻辑表达式可知: 和 进位 可见,C进位有两部分组成:本地进位AB,可记作d,与低位无关;传递进位iiii ,与低位有关;可称为传递条件,记作t则: i 由C的组成可以将逐级传递进位的结构,转换为以进位链的方式实现快速进位。目前i 进位链通常采用串行和并行两种。 2(串行进位链 串行进位链是指并行加法器中的进位信号采用串行传递。 以四位并行加法器为例,每一位的进位表达式可示为: 由上式可见,采用与非逻辑电路可方便地实现进位传递,如下图所示。 若设与非门的级延迟时间为t,那么当d、t形成后,共需8t使可产生最高位的进位。yiiy 实际上每增加一位全加器,进位时间就会增加2t。n位全加器的最长进位时间为2nt。 yy 3(并行进位链 并行进位链是指并行加法器中的进位信号是同时产生的,又称先行进位、跳跃进位等。理想的并行进位链是n位全加器的n位进位同时产生,但实际实现有困难;通常并行进位链有单重分组和双重分组两种实现 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 。 (1)单重分组跳跃进位。单重分组跳跃进位就是将M位全加器分成若干小组,小组内的进位同时产生,小组与小组之间采用串行进位,这种进位又有组内并行、组间串行之称。 以四位并行加法器为例,对其进位表示式稍作变换,便可获得并行进位表达式: 可得与其对应的逻辑图。如下图所示。 设与或非门的级延迟时间为1.5t,如与非门的级延迟时间仍为1t,则d、t形成后,yyii只需2.5t就可产生全部进位。 y 如果将16位的全加器按四位一组分组,便可得单重分组跳跃进位链框图,如下图所示。 不难理解在d、t形成后,经2.5t可产生C、C、C、C四个进位信息,经10t就可iiy3233y =16的串行进位链的全部进位时间为32,可见单重分组方案进位时间产生全部进位,而nty 仅为串行进位链的三分之一。 但随着n的增大,其优势便很快减弱,如当=64时,按4位分组,共为16组,组间有n 16位串行进位,在、形成后,还需经40才能产生全部进位,显然进位时间太长。如dttiiy 果能使组间进位也同时产生,必然会更大地提高进位速度,这就是组内、组间均为并行进位的方案。 (2)双重分组跳跃进位。双重分组跳跃进位就是将n位全加器分成几个大组,每个大组又包含几个小组,而每个大组内所包含的各个小组的最高位进位是同时形成的,大组与大组间采用串行进位。因各小组最高位进位是同时形成的,小组内的其他进位也是同时形成的(注意两小组内的其他进位与小组的最高位进位并不是同时产生的),故又有组(小组)内并行、组(小组)间并行之称。下图是一个32位并行加法器双重分组跳跃进位链的框图。 图中共分两大组,每个大组内包含4个小组,第一大组内的4个小组的最高位进位C、31C、C、C是同时产生的;第二大组内4个小组的最高位进位C、C、C、C也是同时产272319151173生的,而第二大组向第一大组的进位C采用串行进位方式。 15 以第二大组为例,分析各进位的逻辑关系。 例写出第八小组的最高位进位表达式: 式中仅与本小组内的d、t有关,不依赖外来进C, ii-l 故称D为第八小组的本地进位:是将低位进位C传到高位小组的条件,故称8 -1T为第八小组的传送条件。 8 同理可写出第五、六、七小组的最高位进位表达式: 第七小组 第六小组 第五小组 进一步展开又得: 可得大组跳跃进位链,如下图所示。 由图可见,当D、T(i=5,8)及外来进位C形成后,再经过2.5t便可同时产生C、ii-1yl5C,C、C。至于D和T它们都是由小组产生的,按其逻辑表达式可画出相应的电路如下图1173ii 所示。 可见,每小组可产生本小组的本地进位D和传送条件T以及组内的各低位进位,但不ii 能产生组内最高位进位,即 第五组形成、、、、,不产生C; DTCCC5514131215 第六组形成D、T、C、C、C,不产生C; 66109811 第七组形成D、T、C6、C5、C4,不产生C; 777 第八组形成D、T、C、C、C不产生C。 882103 用上两种类型的线路可构成16位加法器的双重分组跳跃进位链框图,如下图所示。 由此可计算出从D、T、及C(外来进位)形成后开始,经2.5T形成C、C、C和全部ii-1y210D、T;再经2.5T形成大组内的四个进位C、C、C、C;再经过2.5T形成第五、六、七iiyl5l173y 小组的其余进位C、C、C、C、C、C、C、C、C,可见,按双重分组设计n=16的进位l413121098654 链,最长进位时间为7.5T,比单重分组进位链又省了2.5T。随着n的增大,双重分组的优yy 越性显得格外突出。 机器究竟采用哪种方案,每个小组内应包含几位,应根据运算速度指标及所选元件等诸方面团素综合考虑。 由上述分析可知,D和T均是由小组进位链产生的,它们与低位进位无关。而D和Tiiii又是大组进位链的输入,因此,引入D和T可采用双重分组进位链,大大提高了运算速度。 ii 74181芯片是4位ALU电路,其四位进位是同时产生的,多片74181级联就犹如本节介绍的单重分组跳跃进位,即组内(74181片内)并行,组间(74181片间)串行。74181芯片的G、P输出就如本节介绍的D、T。当需要进一步提高进位速度时,将74181与74182芯片配合,就可组成双重分组跳跃进位链,如下图所示。 图中74182为先行进位部件,两片74182和8片74181组成32位ALU电路,该电路采用双重分组先行进位方案,在此图中74182还提供了大组的本地进位G和大组的传送条件P。
本文档为【第二节 计算机的基本组成】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_637320
暂无简介~
格式:doc
大小:666KB
软件:Word
页数:74
分类:工学
上传时间:2017-10-06
浏览量:27