计算机组成原理:定点数运算及溢出检测

1.定点数加法运算

[X] + [Y] = [X + Y] mod 2n+1

算法理解
例 1 已知X = +10010, Y = -10101 ,求X + Y

解: [X]=010010 ,[Y]=101011
   [X+Y]=010010+101011
      =111101
所以:X+Y= -00011

2.定点数减法运算

[X-Y]=[X]-[Y]=[X]+[-Y]

算法理解
例2 已知[Y]=10011 ,求[-Y]

解: [Y] =10010
   ∵ \because Y=-1101  -Y=1101
   ∴ \therefore [-Y]=01101

对比 [Y] =10011
可知:通过又向左扫描[Y],在遇到数字1及之前,直接输出遇到的数字,遇到1之后,取反输出,即可得到[-Y],反之亦然!

例3 已知 X= +10101,Y= +10010,求X-Y
解: [X]=010101,[Y]=010010,[-Y]=101110
   [X-Y]= [X]+[-Y]= 010101+101110
      =l 000011
∴ \therefore X-Y= +00011

3.溢出的概念及判断方法

1)溢出的概念

  运算结果超出了某种数据类型的表示范围。

  例4 已知 X= +10010,Y= +10101,求X+Y
  解: [X]=010010  [Y]=010101
    [X+Y]= [X]+[Y]= 010010+010101
        =100111
     ∴ \therefore X+Y= -11001
    两个正数之和为负数!

  例5 已知X= -10010,Y= -10101,求X+Y

  解: [ X ] 补 = 101110 [ Y ] 补 = 101011      [ X + Y ] 补 = [ X ] 补 + [ Y ] 补 = 101110 + 101011   = 1   010001     ∴   X + Y =   + 010001     两 个 负 数 之 和 为 正 数 [X]_补=101110\quad[Y]_补=101011\newline\qquad\quad\ \ \,[X+Y]_补=[X]_补+[Y]_补=101110+101011\newline\qquad\qquad\qquad\qquad\ ={\color{red}{1}}\ 010001\newline\ \newline\qquad\quad\ \therefore\ X+Y=\ +010001\newline\ \newline\qquad\quad\ {\color{red}{两个负数之和为正数}} [X]=101110[Y]=101011  [X+Y]=[X]+[Y]=101110+101011 =1 010001   X+Y= +010001  

2)溢出的检测方法

  溢出只可能发生在同符号数相加时,包括[X]与[Y];[X]
  [-Y]同号;

方法一:对操作数和运算结果的符号位进行检测

当结果的符号位与操作数的符号不相同时就表明发生了溢出(设X0,Y0为参加运算数的符号位,S0为结果的符号位)
V = X 0   Y 0   S ‾ + X 0 ‾   Y 0 ‾   S V=X_0\ Y_0\ \overline{S}+\overline{X_0}\ \overline{Y_0}\ S V=X0 Y0 S+X0 Y0 S

当 V=1 时,运算结果溢出,根据该逻辑表达式,容易画出相应电路。

方法二:对最高数据位进位和符号进位进行检测

设运算时最高数据位产生的进位为C0
溢出检测电路为: V = C 0   ⨁   C 1 V=C_0\ {\bigoplus}\ C_1 V=C0  C1

0. X 1 + 0. Y 1 0.X_1 + 0.Y_1 0.X1+0.Y1: 此时 C0=0,若C1=1则改变了结果符号位,发生了溢出。
1. X 1 + 1. Y 1 1.X_1+1.Y_1 1.X1+1.Y1:此时 C0=1,若C1=0则改变了结果符号位,发生溢出。

方法三:用变形补码

[ X ] 补 = X f 1 X f 2 X 1 X 2 X 3 . . . X n m o d 2 n + 2 [X]_补=X_{f1}X_{f2}X_1X_2X_3...X_n\qquad mod\quad 2^{n+2} [X]=Xf1Xf2X1X2X3...Xnmod2n+2
溢出的判断: V = X f 1   ⨁   X f 2 V=X_{f1}\ {\bigoplus}\ X_{f2} V=Xf1  Xf2

例6 已 知 X =   10010 , Y =   − 10101 , 求 X + Y 解 : [ X ] 补 = 1101110 [ Y ] 补 = 1101011   [ X + Y ] 补 = [ X ] 补 + [ Y ] 补 = 1101110 + 1101011 = 1   10   1001     V = 1   ⨁   0 = 1   故 发 生 溢 出 ! 已知X=\ 10010,\quad Y=\ -10101,\quad 求X+Y\newline 解:[X]_补=1101110\quad[Y]_补=1101011\newline\ [X+Y]_补=[X]_补+[Y]_补=1101110+1101011\newline ={\color{blue}{1}}\ {\color{red}{10}}\ 1001\newline\ \newline\ V=1\ {\bigoplus}\ 0=1\ 故发生溢出! X= 10010Y= 10101X+Y[X]=1101110[Y]=1101011 [X+Y]=[X]+[Y]=1101110+1101011=1 10 1001  V=1  0=1 
上述三种方法可基于逻辑表达式画出相应电路,在后面的运算部分,还将具体讲解。

溢出判断的软件方法

int tadd_ok(int x,int y){ 
   int sum = x + y;
   int net_over = x < 0 && sum >=0;
   int pos_over = x > 0 && sum <0;
   return !neg_over && pos_over;}


注:体会软/硬件功能的等效差异性!体会软/硬件协同系统观!

4.无符号数运算的溢出判断

无符号数加法的溢出可用ALU的进位表示
无符号数减法的溢出也可用带加/减功能的ALU的进位取反后表示

参考文献:https://www.icourse163.org/course/HUST-1003159001侵权删

  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值