2012年(106)
分类: C/C++
2012-05-07 17:47:16
补码加减运算规则
(1)公式:
[X+Y]补=[X]补+[Y]补
[X-Y]补=[X]补+[-Y]补
例 X=0.001010 Y=-0.100011 求[X-Y]补
解 [X]补=0.001010 [-Y]补=0.100011
则 [X-Y]补 = [X]补+[-Y]补
= 0.001010 + 0.100011
= 0.101101
(2)变形补码:
[X+Y] 变补=[X] 变补+[Y] 变补
[X-Y] 变补=[X] 变补+[-Y] 变补
例 X=0.1011 Y=0.0011 求[X+Y]补
解 [X]变补 = 00.1011 [Y]变补 = 00.0011
[X+Y]变补 = 00.1011 +00.0011 = 00.1110
所以 [X+Y]补 = 0.1110
例 X=0.1011 Y=0.1001 求[X+Y]补
解:
[X]变补 =00.1011 [Y]变补 = 00.1001
[X+Y]变补 = 00.1011 +00.1001 = 01.0100
运算结果的两符号位是01,不相同,发生溢出,因第一符号位是0,代表正数, 所以称这种溢出为“正溢出”。
例 X=-0.1101 Y=-0.1010 求[X+Y]补
解 [X]变补 = 11.0011 [Y]变补 = 11.0110
[X+Y]变补 = 11.0011 +11.0110 = 10.1001 (mod 4)
结果的两符号位是10,不相同,发生溢出,因第一符号位是1,代表负数, 所以称这种溢出为“负溢出”。
(3)判断溢出的原则:
当两符号位不同时,溢出;
当两符号位相同时,正确。
原码乘法
1. 原码一位乘法
(1) 一位乘算法描述
设[X]原=Xs.Xn-1Xn-2…Xi…X1X0=Xs.Xv
[Y]原=Ys.Yn-1Yn-2…Yi…Y1Y0=Ys.Yv
则乘积[Z]原=Zs.Zv=(XsYs).(Xv*Yv)
A.手算方法
例如 求A=0.1101和B=0.0110的乘积
原码乘法(一位)
例 已知X=-0.1011 Y=0.1001 求[X·Y]原
解 [X]原=1.1011 [Y]原=0.1001
|X| = 0.1011 |Y| = 0.1001
则按原码一位乘法运算规则,求[X·Y]原的数值部分。
运算过程表所示。
所以|X|·|Y| =0.01100011, 而Zs = XsYs = 10 =1
最后求得[X·Y]原 = 1.01100011
原码乘法(两位)
原码两位乘法
(1) 规则
X*Y考察乘数的相邻两位二进制数
Yi+1Yi 本次位积 部分积操作
0 0 0 2-2(Zi+0*X)
0 1 +X 2-2(Zi+1*X)
1 0 +2X 2-2(Zi+2*X)
1 1 +3X=4X-X 2-2(Zi+3*X)
(2) 关键点
A、由于乘法过程中有加减运算,故要在过程中考虑符号位;
B、求部分积时,第二个符号位有可能被改变;
C、最后一步做完时,还要考察一次标志位,方法是前面加0
偶数位时:00
奇数位时:0,最后移一位
例 设X=0.111111,Y=-0.111001, 求[X·Y]原=?
解: 先求[-X]补=11.000001,其数值部分的乘积按两位乘法规则进行操作:
得数值部分积为 0.111000000111
符号 Zs = Xs Ys = 0 1 = 1
所以 [X·Y]原 =1.111000000111
补码乘法
例:设[X] 补=0,1101,[Y] 补=1,0101,求[XY] 补
解:用补码一位乘法,过程如下:
补码部分积 补码乘数 操作说明
符号位 数值部分 数值部分
0 0 0 0 0 0 01 0 1 Z0=0,y0=1
+ 0 0 1 1 0 1 Z0+[X]补→Z1
0 0 1 1 0 1
0 0 0 1 1 0 1 0 1 0 1/2Z1,y1=0,Z1+0→Z2
0 0 0 0 1 1 0 1 0 1 1/2Z2,y2=1
+ 0 0 1 1 0 1 Z2+[X] 补→Z3
0 1 0 0 0 0
0 0 1 0 0 0 00 1 0 1/2Z3,y3=0,不加, Z3→Z4
0 0 0 1 0 0 00 0 1 1/2Z4,ys=1,校正
+ 1 1 0 0 1 1 Z4+[-X]补,得[XY] 补
1 1 0 1 1 1 0 0 0 1
故[XY] 补=1,01110001,即XY=-10001111
注意:
(A)在补码乘中不必采用绝对值运算
(B)进行校正的前提:
为正:不校正;为负:校正+[-X] 补
布斯乘法规则归纳如下:
首先设置附加位Yn+1=0,部分积初值[Z0]补=0。
l 当n≠0时,判YnYn+1,
若YnYn+1=00或11,即相邻位相同时,上次部分积右移一位,直接得部分积。
若YnYn+1=01,上次部分积加[X]补,然后右移一位得新部分积。
若YnYn+1=10,上次部分积加[-X]补,然后右移一位得新部分积。
l 当n=0时,判YnYn+1(对应于Y0Y1),运算规则同(1)只是不移位。即在运算的最后一步,乘积不再右移。
注意:
(A)比较法中不管乘数为正为负,符号位都参加运算,克服了校正法的缺点
(B)运算过程中采用变形补码运算(双符号位)
(C)算法运算时的关键是YnYn+1的状态:后者(Yn+1)减前者(Yn),判断是加减(+/-X)
例 [X]补=0.1001 [Y]补=1.1011 求[X·Y]补
解 [-X]补 = 1.0111
所以得 [X·Y]补 = 1.11010011
为了提高乘法的运算速度,可采用两位乘法的方案,即直接按乘数的每两位的取值情况,一次求出对应于两位的部分积。
原码一位除法
加减交替法
例 X = -0.1011 Y=0.1101 求[X/Y]原
解: [X]原=1.1011 [Y]原=0.1101
[Y]补=0.1101 [-Y]补=1.0011
商的符号 Qs=1 0 = 1
所以 [X/Y]原 = 1.1101
余数=0.0111*2-4
浮点加减法运算
例 x = 0.1101×1001,y=- (0.1010)×1011,求x+y=?
解:
(1)对阶:
假定两数在计算机中采用补码制,则
[x]补=0001,00.1101 Ex=0001
[y]补=0011,11.0110 Ey=0011
求阶差:△E =Ex-Ey=0001+1101=1110,即△E =-2,表示x的阶码Ex小于y的阶码Ey,阶差为-2,所以应使x的尾数右移2位,阶码加2,则[x]补=0011,00.0011,这时△E =0,对阶完毕。
(2) 尾数求和(差)
x和y对阶后的尾数分别为:[Sx]补=00.0011,[Sy]补=11.0110
则 [Sx]补+[Sy]补=00.0011+11.0110=11.1001
∴ [x+y]补=0011,11.1001
(3) 规格化
和的尾数的两符号位相等,但小数点后的第一位也与符号位相等,不是规格化数,需要进行左规,即向左规格化:尾数左移一位,阶码减1,就可得到规格化的浮点数结果。
[x+y]补=0010,11.0010
浮点数乘法运算
例 已知 x=0.110000·10101 y=-0.111000·10100,设阶码数值部分各取5位,阶符2位;尾数数值部分各取6位,尾符2位,按机器浮点数运算步骤,求x·y。
解 : (1) 求阶和
[Ex]补=0000101 [Ey]补=00 00100
[△E]补=[Ex]补 + [Ey]补 = 00 01001
(2) 尾数相乘
可利用原码或补码定点数乘法求尾数之乘积,可得
[Sx·Sy]原 =1.101010000000
或 [Sx·Sy]补 =1.010110000000
(3) 规格化
可看出[Sx·Sy]原或[Sx·Sy]补已是规格化形式,勿需规格化。
(4) 舍入
若取单字长乘积,可得[Sx·Sy]原=1.101010或[Sx·Sy]补=1.010110,所以
[x·y]原=1.101010·100001001
[x·y]补=1.010110·100001001
得 x·y = -0.101010·101001
= -101010000