第 4 章 机器数的运算方法及运算器
第 4 章 机器数的运算方法及运算器. 目 录. 4.1 机器数的加减运算及其实现 4.2 定点乘法及其实现 4.4 浮点数的算术运算 4.5 运算器的组成和结构. 4.1 机器数的加减运算及其实现. 4.1.1 原码加法 4.1.2 补码加法 4.1.3 减法运算 4.1.4 补码加减运算线路的实现. 4.1.1 原码加法. 1.符号相同的两个原码相加:符号相同的两个原码相加,只要两个数的数值相加即可,其符号不变。. 例4.1 设 X=+10001,Y=+01011, 求 Z=X+Y 解:
第 4 章 机器数的运算方法及运算器
E N D
Presentation Transcript
目 录 4.1 机器数的加减运算及其实现 4.2 定点乘法及其实现 4.4 浮点数的算术运算 4.5运算器的组成和结构
4.1 机器数的加减运算及其实现 4.1.1 原码加法 4.1.2 补码加法 4.1.3 减法运算 4.1.4 补码加减运算线路的实现
4.1.1 原码加法 1.符号相同的两个原码相加:符号相同的两个原码相加,只要两个数的数值相加即可,其符号不变。 例4.1 设X=+10001,Y=+01011,求Z=X+Y 解: 即,Z=+11100。
例4.2 设X=-10001,Y=-01011,求Z=X+Y 解: 即,Z=-11100。
4.1.1 原码加法 2.符号相异的两个原码相加:先比较两数的绝对值大小,用绝对值大的数减去绝对值小的数,结果的符号是绝对值大的数的符号。 【例4.3】设X=+10101,Y=-01010,求Z=X+Y 解: 先比较X与Y的绝对值,本题∣X∣>|Y|,所以做减法|X∣-|Y|, 结果是Z=+01011
例4.2 设X=+01010,Y=-10111,求Z=X+Y 解: 先比较X与Y的绝对值,本题∣Y∣>|X| ,所以做减法|Y∣-|X|, 结果是Z=-01101
4.1.1 原码加法 用原码进行符号不同的两个数相加时有以下三步运算: ① 比较两个数的绝对值的大小; ② 绝对值大的数的绝对值减去绝对值小的数的绝对值; ③ 结果赋以绝对值大的那个数的符号。
4.1.2 补码加法 补码运算特点:①补码运算时,不用判断符号位,符号位与数值一块参与运算; ②两数相加之后,进位的最高位超出字长部分自动丢失。 1.定点补码运算性质 性质1 两数之和的补码等于两数补码之和。 [X+Y]补=[X]补+[Y]补
例4.5 设X=+11010,Y=-10101,用补码的加法求Z=X+Y 解:加数和被加数的数值位都是5位,在数值位之前加1位符号位。这样, [X]补=011010,[Y]补=101011 [X+Y]补= [X]补+[Y]补= 011010+101011=000101 所以,X+Y=+00101。 注意:在运算中,数值位和符号位有进位,本例采用单符号位,以2为模,进位的1就丢掉了。
例4.6 设X=+10101,Y=-11010,用补码加法求Z=X+Y 解:[X]补= 010101,[Y]补=100110 [X+Y]补=[X]补+[Y]补= 010101+100110=111011 所以,X+Y=-00101。
性质2 一个负数的补码的补码就是这个负数的原码。[[X]补]补=[X]原 例4.7 设有两个定点小数 X=-0.10011,Y=-0.11001,求这两个负数补码的补码。 解: [X]原=1.10011 [Y]原=1.11001 [X]补=1.01101 [Y]补=1.00111 [[X]补]补=1.10011=[X]原 [[Y]补]补=1.11001=[Y]原 补码这一性质,计算机中计算结果的补码均可化成该数的原码。
例4.8 设有两个定点小数 X=-0.1101,Y=0.0111,(-1<X+Y<0),求这两数之和。 解:[X]补=1.0011 [Y]补=0.0111 [X]补+[Y]补=1.0011+0.0111=1.1010 [X+Y]原=[[X]补+[Y]补]补=[1.1010]补=1.0110 所以,X+Y=-0.0110 用真值进行运算:X+Y=-0.1101+0.0111=-0.0110 结果相同。 用补码做加法是数值位连同符号位一起参加运算的。但是在有溢出的情况下,用一般的补码加法就得不到正确的结果,再看下面的例子。
例4.9 设有两个定点小数X=+0.10111,Y=+0.10001,用补码的加法求Z=X+Y 解:[X]补= 0.10111,[Y]补=0.10001 [X+Y]补= [X]补+[Y]补=0.10111+0.10001=1.01000 Z=X+Y=-0.11000 两个大于0.5的正数相加,结果就为负值,结果显然是错误的。
例4.10 设X=-0.10111,Y=-0.10001,用补码的加法求Z=X+Y 解:[X]补=1.01001,[Y]补=1.01111 [X+Y]补= [X]补+[Y]补=1.01001+1.01111=0.11000 Z=X+Y=+0.11000 两个绝对值大于0.5的负数相加,结果为正值,这也是错误的。 它们的和超出了机器数所能表示的最大范围,即产生了溢出,在有溢出的情况下,用一般补码加法就无法得到正确结果。
例4.11 设有两个定点小数X=+0.10111,Y=-0.10001,用补码的加法求Z=X+Y 解:[X]补= 0.10111,[Y]补=1.01111 [X+Y]补= [X]补+[Y]补 =0.10111+1.01111=0.00110 所以,Z=+0.00110,没有发生溢出,结果是正确的。
例4.12 设有两个定点小数X=-0.10111,Y=+0.10001,用补码的加法求Z=X+Y 解:[X]补=1.01001,[Y]补=0.10001 [X+Y]补= [X]补+[Y]补=1.01001+0.10001 =1.11010 [[X+Y]补]补=1.00110 Z=X+Y=-0.00110 所以,Z=-0.00110,没有发生溢出,结果也是正确的。
2.变形补码加法 变形补码是符号位用两位来表示的补码。 变形补码的定义为 : 对于变形补码,补码的加法性质公式同样适用,即: [X+Y]变形补= [X]变形补+[Y]变形补 [[X]变形补] 变形补=[X]原
用双符号位进行判断,若和的两个符号位相同(00或11),不发生溢出;若和的两个符号位相异(01或10),就说明发生了溢出。遇到溢出,就要停机进行如下处理:选取一个合理的比例因子H=2i,对每个加数都除以H,然后相加,其结果再乘以H,即得所求。
下面我们对例4.9和例4.10用变形补码加法来求结果。下面我们对例4.9和例4.10用变形补码加法来求结果。 【例4.13】设X=+10111,Y=+10001,用变形补码的加法求Z=X+Y 解:设比例因子H=2,则有 所以, X+Y=+101000
【例4.14】设X=-10111,Y=-10001,用变形补码的加法求Z=X+Y【例4.14】设X=-10111,Y=-10001,用变形补码的加法求Z=X+Y 解:设比例因子H=2, 则有: 所以:X+Y=-101000
说 明 ⑴ 舍入处理 在变形补码运算中,加数除以H=2i,是通过把[X]补右移I位得到的。在移位时,末几位可能超出机器的最末位而丢失,造成误差。为了减少误差,通常要进行舍入处理,一般有两种方法: ① 恒置1。即移位后机器末位总是1。上面的例子就 是用的恒置1的方法。 ② 0舍1入。即移出去的数是0则抹去,移出去的数 是1则进1到末位。 ⑵ 符号位扩展 补码在右移时,要注意符号位要一起移,且最左边一位要补上原符号位的值,这就叫做符号位扩展,即把符号位扩展到为3位。
说 明 总结以上,得出补码相加的规则: ① 若两数符号不同,相加的结果即为和的补码。 ②若两数符号相同,相加后若其和的符号不变,则结果是和的补码。 ③若两数符号相同,相加后若其和的符号改变,则表示发生了溢出。两个正数相加,结果的符号为“01”,表示发生正溢出;两个负数相加,结果的符号为“10”,表示发生负溢出。
4.1.3 减法运算 性质3 两数之差的补码等于被减数的补码与负的减数补码之和。[X-Y]补=[X]补+[-Y]补 由性质1推导得:[X-Y]补=[X+(-Y)]补=[X]补+[-Y]补 例4.15 两个正数相减,被减数大于减数的例子。设X=+11001,Y=+10001,求Z=X-Y。 解:[X]补= 00.11001,[-Y]补=11.01111 [X-Y]补= [X]补+[-Y]补= 00.11001+11.01111=00.01000 X-Y=+01000 所以,Z=+01000
例4.16 两个正数相减,被减数小于减数的例子。设X=+10011,Y=+11001,求Z=X-Y。 解:[X]补= 00.10011,[-Y]补=11.00111 [X-Y]补= [X]补+[-Y]补= 00.10011+11.00111 =11.11010 X-Y =-00110 所以,Z =-00110
【例4.17】两负数相减,被减数大于减数的例子。设X=-10011,Y=-11001,求Z=X-Y。【例4.17】两负数相减,被减数大于减数的例子。设X=-10011,Y=-11001,求Z=X-Y。 解:[X]补= 11.01101,[-Y]补=00.11001 [X-Y]补 = [X]补+[-Y]补 =11.01101+00.11001 =00.00110 X-Y =+00110 所以,Z= +00110
【例4.18】两负数相减,被减数小于减数的例子。设X=-11001,Y=-10011,求Z=X-Y。【例4.18】两负数相减,被减数小于减数的例子。设X=-11001,Y=-10011,求Z=X-Y。 解:[X]补= 11.00111,[-Y]补=00.10011 [X-Y]补=[X]补+[-Y]补=11.00111+00.10011 =11.11010 X-Y=-00110 所以,Z=-00110
4.1.4 补码加减运算线路的实现 在线路实现上,若已有[Y]补,求[-Y]补可用把[Y]补每一位(包括符号位和数值位)取反,再在最低位加1来实现。 实现补码加减运算的逻辑电路如右图所示。
4.1.4 补码加减运算线路的实现 图中各个部件的名称和功能是: F 表示多位并行加法器,它的功能是接收参加运算的两个数X和Y,实现加法运算,并在输出端给出本次运算结果。加法器的最低一位可以接收一个进位信号1→F。 X和Y临时存放参加运算数据的两个寄存器,X还用来保存运算的结果。 A “与”门,功能是控制寄存器X输出的内容是否送到加法器F的左输入端,用X→F信号控制。 C “与”门,功能是控制加法器F的运算结果是否写回寄存器X,用F→X信号控制。 B “与或”门,功能是通过控制信号Y→F和→F分别把Y寄存器中的内容是原数据送加法器F还是各位取反后送加法器F。
运算原理如下: 参加运算的两个数被送到寄存器X和Y,以补码的形式保存。要实现[X+Y]补→X,需给出X→F、Y→F两个控制信号,就可以把[X]补和[Y]补送入加法器F的两个输入端,加法器再完成两个补码[X]补和[Y]补的相加。加法完成之后,再通过F→X命令,把相加结果送入寄存器X。 若要完成[X-Y]补→X,“与”门A送出的还是[X]补,但“与或”门B送出的应是Y每一位的取反值,并在加法器的最低位加进位信号1→F,这样就得到[-Y]补,通过加法器F相加,就实现了[X]补+[-Y]补,也就是[X-Y]补。再通过F→X命令,把[X-Y]补送入寄存器X。
4.2 定点乘法及其实现 4.2.1 原码一位乘法及其实现 4.2.2 定点补码一位乘法及其实现 4.2.3 原码两位乘法 4.2.4 补码两位乘法(了解)
4.2.1 原码一位乘法及其实现 在定点计算机中,用两个原码表示的数相乘,其乘积的符号由两数的符号位异或得到,乘积的数值部分是两数的绝对值相乘之积。 例如,有两个数X和Y,[X]原=XsX1X2…Xn [Y]原=YsY1Y2…Yn 则 [X*Y]原=[X]原*[Y]原。 乘积的符号位为:Xs⊕Ys 乘积的数值部分为:(X1X2…Xn)*(Y1Y2…Yn)。
例如:X=0.1001,Y=0.1101 求Z=X*Y 解: 0.1001 X 0.1101 1001 0000 1001 1001 0.01110101 得到相乘结果X*Y= 0.01110101
在计算机中其运算规则是:根据乘数Y绝对值每个数位上的值Yi是“1”还是“0”(从最低位Y0开始),决定本次部分积是加上被乘数X的绝对值,还是加上全“0”,得到的新部分积右移一位,再重复上面的动作,直到乘法做完为止。
【例4.20】X=+11010,Y=+10110,求Z=X*Y 解:[X]原=0.11010,[Y]原=0.10110 乘积的符号位Z0=0⊕0=0 乘积的数值部分是两数的绝对值相乘。开始时,部分积为全“0”。
所得结果Z=+0.1000111100。 有时部分积的符号位出现“1”,并不是出现了负数,而是部分积的值超出了“1”,右移时符号位应补“0”。
实现原码一位乘法的逻辑电路框图 要实现原码一位乘法,乘积的符号可以用异或门实现,异或门的两个输入为相乘两数的符号,输出即为乘积的符号。 下图给出了实现原码一位乘法的逻辑电路框图,以实现对相乘两数的数值位相乘。
主要组成部件有: 寄存器A,存放计算的部分积Z,具有自动移位功能; 寄存器B,存放被乘数X; 寄存器C,存放乘数Y,具有自动移位功能; 加法器F,进行部分积和被乘数相加; 计数器i,用来控制逐位相乘的次数。 控制信号A→F、B→F分别通过与门控制部分积、被乘数送入加法器F进行相加;控制信号A/2→A、C/2→C分别控制寄存器A、C自行右移一位。
4.2.2 定点补码一位乘法及其实现(重点) 假设两个数X和Y相乘,X=x0.x1x2x3…xn;Y=y0.y1y2y3…y 两个正数补码数相乘,其结果应直接得到乘积的补码: [X]补*[Y]补=[X*Y]补 因为:[X*Y]补=X*Y=[X]原*[Y]原=[X]补*[Y]补 那么:X、Y为任意符号呢?
⑴ 当被乘数X的符号为任意,乘数Y的符号为正。因为Y≥0,[Y]补=Y,则 [X]补*[Y]补=[X]补*Y=[X*Y]补 由于:[X]补*[Y]补 =[X]补*Y =[X]补*(0.y1y2y3…yn) =[X*Y]补
⑵ 当被乘数X的符号为任意,乘数Y的符号为负。因为Y<0,则 (3)综上所述:
⑶ BOOTH法 假设两个数X和Y相乘,X=x0.x1x2x3…xn;Y=y0.y1y2y3…y当被乘数X和乘数Y的符号都任意时侯。 [X*Y]补=[X]补*(0. y1y2y3…yn)-[X]补*y0 =[X]补*(- y0+0. y1y2y3…yn) =[X]补*(-y0+y1*2-1+y2*2-2+y3*2-3…yn*2-n) =[X]补*{(y1-y0)+(y2-y1)*2-1+(y3-y2)*2-2+(y4-y3) *2-3…(yn-yn-1)*2-(n-1)+(0-yn)*2-n}
写成递推公式: [Z0]补=0 [Z1]补=2-1*{[Z0]补+(Yn+1-Yn)*[X]补}Yn+1=0 [Z2]补=2-1*{([Z1]补+(Yn-Yn-1)*[X]补)} [Z3]补=2-1*{([Z2]补+(Yn-1-Yn-2)*[X]补)} ┇ [Zi]补=2-1*{([Zi-1]补+(Yn-i+2-Yn-i+1)*[X]补)} ┇ [Zn+1]补=([Zn]补+(Y1-Y0)*[X]补) 最后乘积为[Zn+1]补式中,Yn+1为附加位,在Yn+1以后,Yn+1=0。
由此,可以总结出比较法补码乘法的规则: 在作补码一位乘法时,在乘数的最末位后面再加一位附加位yn+1。开始时,yn+1=0,第一步运算是根据yn+1 yn这两位的值判断后决定,然后再根据yn yn-1这两位的值判断第二步该作什么运算,再根据yn-2 yn-3这两位的值判断第三步该作什么运算,如此等等。因为每进行一步,乘数都要右移一位,yn-1 yn就移到yn yn+1位置上。作第三步时,原来的yn-2 yn-1移到了yn-1 yn位置上。所以每次只要判断yn yn+1这两位的值就行。判断规则如表4-1所示。
【例4.20】利用补码一位乘法计算Z=X*Y ,其中X=-0.1101,Y=0.1011。 解:[X]补=11.0011,[Y]补=0.1011,[-X]补=00.1101 乘积的数值部分是两数的绝对值相乘。开始时,部分积为全“0”。 • 所以[X*Y]补=11.01110001, • 结果Z=X*Y=-0.10001111。
部分积 乘数/判别位 说明 00.0000 01011 0 yn+1=0 判别位10 • +[-x]补00.1101部分积加+[-x]补 • 00.1101 • 00.011010101 1 右移1位,判别位11 • 00.0011 01010 1 右移1位,判别位01 • +[x]补11.0011 +[x]补 • 11.0110 • 11.101100101 0 右移1位,判别位10 • +[-x]补 00.1101 +[-x]补 • 00.1000 • 00.0100 00010 1 右移1位,判别位01 • +[x]补 11.0011 +[x]补 • 11.0111 0001最后一步不移位
实现一位补码乘法的逻辑原理图如图4-4所示。它与一位原码乘法的逻辑原理图有些相似,不同的地方有以下几点: ⑴被乘数和乘数的符号位参加运算; ⑵乘数寄存器C有附加位Yn+1,其初始状态为“0”。当乘数和部分积每次右移时,部分积最低位移入寄存器C的首位位置,所以寄存器C必须是具有右移功能的寄存器。 ⑶被乘数寄存器B的每一位用原码或反码(可用触发器的Q端或端输出)经多路开关传送到加法器对应位的一个输入端,而多路开关的控制信号由Yn-1、Yn的输出译码器产生。当Yn-1Yn=01时,送[X]补;当Yn-1Yn=10时,送[-X]补,即送寄存器B内容的反码且在加法器末位加1。 ⑷寄存器A用来保存部分积,该寄存器也应具有右移的功能,其符号位与加法器的符号位始终一致。 ⑸当计数器i=n+1时,封锁A/2→A,C/2→C控制信号,使最后一步不移位。