[A+B]补= 0.0010010 + 1.1001100 = 1.1011110 ——无溢出 A+B= -0.010 0010B = -17/64
(2)A=19/32= 0.100 1100B, B= -17/128= -0.001 0001B [A]补=0.100 1100, [B]补=1.110 1111 , [-B]补=0.001 0001
[A-B]补= 0.1001100 + 0.0010001= 0.1011101 ——无溢出 A-B= 0.101 1101B = 93/128B
(3)A= -3/16= -0.001 1000B, B=9/32= 0.010 0100B [A]补=1.110 1000, [B]补= 0.010 0100
[A+B]补= 1.1101000 + 0.0100100 = 0.0001100 —— 无溢出 A+B= 0.000 1100B = 3/32
(4) A= -87= -101 0111B, B=53=110 101B
[A]补=1 010 1001, [B]补=0 011 0101, [-B]补=1 100 1011
[A-B]补= 1 0101001 + 1 1001011 = 0 1110100 —— 溢出 (5)A=115= 111 0011B, B= -24= -11 000B [A]补=0 1110011, [B]补=1,110 1000
[A+B]补= 0 1110011 + 1 1101000 = 0 1011011——无溢出 A+B= 101 1011B = 91
20. 用原码一位乘、两位乘和补码一位乘(Booth算法)、两位乘计算x·y。 (1)x= 0.110 111,y= -0.101 110; (2)x= -0.010 111,y= -0.010 101; (3)x= 19,y= 35;
(4)x= 0.110 11,y= -0.111 01。
解:先将数据转换成所需的机器数,然后计算,最后结果转换成真值。 (1)[x]原=0.110111,[y]原=1.101110,x*=0.110111, y*=0.101110 原码一位乘: 部分积 乘数y* 说明 0.000 000 101 110 部分积初值为0,乘数为0加0 +0.000 000 0.000 000 右移一位 0.000 000 010 111 乘数为1,加上x* +0.110 111 0.110 111 右移一位 0.011 011 101 011 乘数为1,加上x* +0.110 111 1.010 010 右移一位 0.101 001 010 101 乘数为1,加上x* +0.110 111 1.100 000 右移一位 0.110 000 001 010 乘数为0,加上0 +0.000 000 0.110 000 右移一位 0.011 000 000 101 乘数为1,加上x* +0.110 111 1.001 111 右移一位 0.100 111 100 010 即x*×y*=0.100 111 100 010,z0=x0? y0=0 ?1=1, [x×y]原=1.100 111 100 010,x·y= -0. 100 111 100 010 原码两位乘:[-x*]补=1.001 001,2x*=1.101 110 部分积 乘数y* Cj 说明 000 . 000 00 101 110 0 部分积初值为0,Cj=0 000 根据yn-1ynCj=100,加2x*,保持+001 . 101 Cj=0 110 001 . 101 0 110 000 . 011 10 001 011 0 右移2位 011 10 001 011 根据yn-1ynCj=110,加[-x*]补,置+111 . 001 Cj=1 001 111 . 100 右移2位 100 00 100 010 1 111 . 111 根据yn-1ynCj=101,加[-x*]补,置001 Cj=1 +111 . 001 001 111 . 000 010 10 001 000 1 右移2位 111 . 110 根据yn-1ynCj=001,加x*,保持Cj=0 000 +000 . 110 111 000 . 100 10 001 0 111 即x*×y*=0.100 111 100 010,z0=x0? y0=0 ?1=1, [x×y]原=1.100 111 100 010,x·y= -0. 100 111 100 010
补码一位乘:[x]补=0.110111,[-x]补=1.001001,[y]补=1.010010 部分积 乘数 Yn+1 说明 00 . 000 1 010 010 0 Ynyn+1=00,部分积右移1位 000 0 101 001 0 Ynyn+1=10,部分积加[-x]补 00 . 000 000 +11 . 001 001 11 . 001 右移1位 001 11 . 100 1 010 100 1 Ynyn+1=01,部分积加[x]补 100 +00 . 110 111 00 . 011 右移1位 011 00 . 001 1 101 010 0 Ynyn+1=00,部分积右移1位 101 1 110 101 0 Ynyn+1=10,部分积加[-x]补 00 . 000 110 +11 . 001 001 11 . 001 右移1位 111 11 . 100 1 111 010 1 Ynyn+1=01,部分积加[x]补 111 +00 . 110 111 00 . 011 右移1位 110 0 111 101 0 Ynyn+1=10,部分积加[-x]补 00 . 001 111 +11 . 001 001 11 . 011 0 111 10 000 即 [x×y]补=1.011 000 011 110,x·y= -0.100 111 100 010 补码两位乘:
2[x]补=001.101110,2[-x]补=1.001001 部分积 乘数 Yn+1 说明
结果同补码一位乘, x·y= -0. 100 111 100 010 00
21. 用原码加减交替法和补码加减交替法计算x÷y。 (1)x=0.100111,y=0.101011; (2)x=-0.10101, y=0.11011; (3)x=0.10100, y= -0.10001; (4)x=13/32, y= -27/32。 解:(1)x*=[x]原=[x]补=x= 0.100 111 y*=[y]原=[y]补=y= 0=0 ?y0=0 ?0.101 011 [-y*]补=[-y]补=1.010 101 q0=x0 y]原=0.111 010 r*=0.000 010×2-6=0.000 000 000 010 ?y*=[x?y=x*?x 计算过程如下: 原码加减交替除法: 被除数(余数) 商 0 . 1 0 0 1 1
1 0 . 0 0 0 0 0 0 + 1 . 0 1 0 1 0 1 试减,+[-y*]补 1 . 1 1 1 1 0 1 . 1 1 1 0 0 0 0 . + 0 . 1 0 1 0 1 1 ?0 1 r< 1 . 0 0 0 1 1 0 ?0,+y* 0 . 1 0 0 0 1 1 1 0.1 + 1 . 0 1 0 1 0 1 r>?0, +[-y*]补 0 . 0 1 1 0 1 1 1 0 . 1 1 0 1 1 0 0.1 1 + 1 . 0 1 0 1 0 1 r>0, +[-y*]补 0 . 0 0 1 0 1 1
0 .?续: 被除数(余数) 商 1 0 1 0 1 1 0 0 . 1 1 1 + 1 . 0 1 0 1 0 1 r>0, 1 . 0 1 0 1 1 0 0.1 1 1 0 ?+[-y*]补 1 . 1 0 1 0 1 1 1 + 0 . 1 0 1 0 1 1 r< 0 . 0 0?0,+y* 0 . 0 0 0 0 0 1 1 0 0 1 0 0.1 1 1 0 1 + 1 . 0 1 0 1 0 1 r>0, 0.1 1 1 0 1 0 + 0 . 1 0 1 0 1 1 ?+[-y*]补 1 . 0 1 0 1 1 1 1 r<0,+y*(恢复余数) 0 . 0 0 0 0 1 0 补码加减交替除法: 被除数(余数) 商 0 0 . 1 0 0 1 1 1 0 . 0 0 0 0 0 0 + 1 1 . 0 1 0 1 0 1 1 . 1 1 1 0 0 0 ?1 试减,x、y同号,+[-y]补 1 1 . 1 1 1 1 0 0 1 0 . + 0 0 . 1 0 1 0 1 1 r、y异号,+[y]补 0 0 0 1 . 0 0 0 1 1 0 0.1 + 1 1 . 0 1?. 1 0 0 0 1 1 1 0 0 . 1 1 0?0 1 0 1 r、y同号, +[-y]补 0 0 . 0 1 1 0 1 1 1 1 1 0 0.1 1 + 1 1 . 0 1 0 1 0 1 r、y同号, +[-y]补 0 0 . 0 0 1 0 1 1
0 0 . 0 1 0 ?续: 被除数(余数) 商 1 1 1 0 0 . 1 1 1 + 1 1 . 0 1 0 1 0 1 r、y同号, +[-y]补 1 1 . 0 1 0 1 1 0 0.1 1 1 0 + ? 1 1 . 1 0 1 0 1 1 1 0 0 . 0?0 0 . 1 0 1 0 1 1 r、y异号,+[y]补 0 0 . 0 0 0 0 0 1 1 0 0 0 1 0 0.1 1 1 0 1 + 1 1 . 0 1 0 1 0 1 r、y同号, 0.1 1 1 0 1 1 —— 恒置1 + 0 0 . 1 0 1 ?+[-y]补 1 1 . 0 1 0 1 1 1 1 0 1 1 r、x异号,(恢复余数) 0 0 . 0 0 0 0 1 0 且r、y异号, +[y]补 y]补= 0.111 011 [r6]补=0.000 010,r=r*=0.000 000 000 010?y=[x?注:恒置1引入误差。 x
(2)x= -0.101 01,y=0.110 11 [x]原=1.101 01 x*= 0.101 01 y* = [y]原 = [y]补= y = 0.110 11 [-y*]补= [-y]补= 1.001 01 [x]补= 1.010 11 y?y]原=1.110 00 x?y*= 0.110 00 [x? 0 = 1 x*? y0 = 1 ? q0 = x0 = -0.110 00 r*=0.110 00×2-5 =0.000 001 100 0 计算过程如下: 原码加减交替除法: 被除数(余数) 商 0 . 1 0 1 0 1 0 . 0 ?0 0 0 0 + 1 . 0 0 1 0 1 试减,+[-y*]补 1 . 1 1 0 1 0 1 1 . 1 0 1 0 0 0 . + 0 . 1 1 0 1 1 r< 0 . 1 1 1 1 0 0.1 ?0,+y* 0 . 0 1 1 1 1 1 + 1 . 0 0 1 0 1 r> 0 . 0 0?0, +[-y*]补 0 . 0 0 0 1 1 1 1 1 0 0.1 1 + 1 . 0 0 1 0 1 r>0, +[-y*]补 1 . 0 1 0 1 1
0 . 1 0 1 1 0 ?续: 被除数(余数) 商 1 0 . 1 1 0 + 0 . 1 1 0 1 1 r<0, +y* 1 . 1 0 0 0 1 . 0 0 0 1 0 0.1 1 0 0 + 0 . 1 1 0 1 1 ?1 1 r< 0.1 1 0 0
0 + 0 . 1 1 0 1 1 ?0,+y* 1 . 1 1 1 0 1 1 r<0, +y*(恢复余数) 0 . 1 1 0 0 0
补码加减交替除法: 被除数(余数) 商 1 1 . 0 1 0 1 1 0 . 0 0 0 0 0 + 0 0 . 1 1 0 1 1 0 0 . 0 1 1 0 0 ? 试减,x、y异号,+[y]补 0 0 . 0 0 1 1 0 1 1 . + 1 1 . 0 0 1 0 1 r、y同号,+[-y]补 1 1 . 1 0 0 0 1 1 . 0 0 0 1 0 1.0 + 0 0 . 1 1 0 1 1 ?1 1 1 1 . 1 1 0 1 0 ? r、y异号, +[y]补 1 1 . 1 1 1 0 1 1 1.0 0 + 0 0 . 1 1 0 1 1 r、y异号, +[y]补 0 0 . 1 0 1 0 1
0 1 . 0 1 0 1 0 1 . 0 0 1?续: 被除数(余数) 商 1 0 0? + 1 1 . 0 0 1 0 1 r、y同号, +[-y]补 0 0 . 0 1 1 1 1 1 . 1 1 1 1 0 1.0 0 1 1 + 1 1 . 0 0 1 0 1 1.0 0 1 1 1 —— 恒置1 + 1 1 . 0 0?r、y同号,+[-y]补 0 0 . 0 0 0 1 1 1 1 0 1 r、x异号,(恢复余数) 1 1 . 0 1 0 0 0 且r、y同号,+[-y]补 y=?y]补=1.001 11,x?注:恒置1引入误差。 [r5]补=1.010 00, r= -0.000 001 100 0 [x -0.110 01
(3)x= 0.101 00,y= -0.100 01 x*= [x]原= [x]补= x=0.101 00 [y]原 = 1.100 01 y* = 0.100 01 [-y*]补=1.011 11 [y]补= 1.011 11 y*= 1.001 01 —— 溢出 ? 1 = 1 x*? y0 = 0 ? [-y]补= 0.100 01 q0 = x0 y = -1.001 01 r*=0.010 11×2-5 =0.000?y]原:无定义 x? [x 000 101 1 计算过程如下: 原码加减交替除法: 被除数(余数) 商 0 . 1 0 1 0 0 0 . 0 0 0 0 0 + 1 . 0 1 1 1 1 试减,+[-y*]补 0 . 0 0 0 . 0 0 1 1 0 1?0 1 1 1 . + 1 . 0 1 1 1 1 r>0, +[-y*]补 1 . 1 0 1 0 1 1 . 0 1 0 1 0 1.0 + 0 . 1 0? 1 0 0 1 r< 1 . 1 0 1 1 0 ?0, +y* 1 . 1 1 0 1 1 1 1.0 0 + 0 . 1 0 0 0 1 r<0, +y* 0 . 0 0 1 1 1
0 . 0 1 1 1 0 1 . 0 0 1 ?续: 被除数(余数) 商 1 + 1 . 0 1 1 1 1 r> 1 . 1 1?0, +[-y*]补 1 . 1 1 1 0 1 1 0 1 0 1.0 0 1 0 + 0 . 1 0 0 0 1 r<0,+y* 1.0 0 1 0 1 r?0 . 0 1 0 1 1 1>0, 结束 注:当x*>y*时产生溢出,这种情况在第一步运算后判断r的正负时就可发现。此时数值位占领小数点左边的1位,原码无定义,但算法本身仍可正常运行。
补码加减交替除法: 被除数(余数) 商 0 0 . 1 0 1 0 0 0 . 0 0 0 0 0 + 1 0 0 . 0 0 1 ?1 . 0 1 1 1 1 试减,x、y异号,+[y]补 0 0 . 0 0 0 1 1 1 1 0 0 . + 1 1 . 0 1 1 1 1 r、y异号,+[y]补 1 1 . 0 1 0 1 0 0.1 + 0 0 .? 1 1 . 1 0 1 0 1 1 1 1 . 1 0 1?1 0 0 0 1 r、y同号, +[-y]补 1 1 . 1 1 0 1 1 1 1 0 0.1 1 + 0 0 . 1 0 0 0 1 r、y同号, +[-y]补 0 0 . 0 0 1 1 1
0 0 . 0 1 1 1 0 ?续: 被除数(余数) 商 1 0 . 1 1 0 + 1 1 . 0 1 1 1 1 r、y异号, +[y]补 1 1 . 1 1 . 1 1 0 1 0 0.1 1 0 1 + 0 0 . 1 0 0 0?1 1 1 0 1 1 0.1 1 0 1 1 ——