Chinaunix首页 | 论坛 | 博客
  • 博客访问: 112880
  • 博文数量: 106
  • 博客积分: 2025
  • 博客等级: 大尉
  • 技术积分: 1165
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-06 12:51
文章分类

全部博文(106)

文章存档

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

阅读(729) | 评论(0) | 转发(0) |
0

上一篇:JAVA重点编程题2

下一篇:计算器

给主人留下些什么吧!~~