注释:阶码和尾数都需要符号位区分正负
例题1:x = 2^-11*0.100101, y = 2^-10*(-0.011110),求x+y
第零步 补码表示
- 对于x来说-11 补码表示为 11011;
0.100101补码表示为00.100101 - 对于y来说-10补码表示为 10110;
-0.011110补码表示为11.100010
第一步 阶码对阶
阶码对齐后才能加减。规则是阶码小的向阶码大的数对齐,若阶码相等则不用对阶
因为-11 < -10,所以x数值需要右移,x阶码和数值变为
10110;0.010010(1)
第二步 尾数相加
00.010010(1)
+11.100010
=11.110100(1)
第三步 尾数规格
规格化处理:当两个符号位相同(说明运算结果没有溢出),但最高数值位与符号位相同时需要进行左归,此时要把位数连续左移,直到最数值位与符号位数值不同为止。
例2:11.1xxx和00.0xxx的最高数值位与符号位相同,需左归。
11.1xxx左移一位结果为(1)11.xxx,阶码减1;
00.0xxx左移一位结果为(0)00.xxx,阶码减1;
当两个符号位不相同(说明运算结果溢出),需右归 。
例3:01.xxxx和10.xxxx的两个符号位不相同,需要进行右归。
01.xxxx右移一位结果为00.1xxx,阶码加1;
10.xxxx右移一位结果为11.0xxx,阶码加1;
继续例题1中,11.110100(1) 明显是最高数值位与符号位相同,需左归两次
第一次11.101001
第二次11.010010,最后一位补0
阶码由变为10110 减二变为 10100(十进制的-12)
第四步 尾数舍入
这里看要求了,需要说明的是,如果因为舍入造成尾数溢出,需要再进行第三步,将尾数继续规格化
例4: 11.010100(1),使用0舍1入法,
结果为11.010101
11.010100(1),使用横置1法,
结果为11.010101
例5: 11.010100(0),使用0舍1入法
结果为11.010100
11.010100(0),使用横置1法,
结果为11.010101
继续例题1中尾数11.010010无需舍入处理
第五步 阶码溢出
因为第三步 规格化,不论尾数如何变换,都不会造成尾数溢出,只会影响阶码大小,所以当且仅当阶码溢出时才可能抛出异常。
溢出分为以下两种情况
-
阶码上溢出。正指数(即阶码值)超过了最大允许值。比如阶码用8bit移码表示,正指数却有128,即无法表示(8bit移码中真值表示范围为-126~127,-127的阶码全0表示非规格化数;而-128的阶码全1,表示无穷大)即上溢出。 如果结果为整数,则称为正上溢出;如果结果为负数,则称为负上溢出。这种情况为软件故障,需要引入溢出故障处理程序来处理。
-
阶码下溢出。一个负指数比最小所允许的数值还要小时,发生下溢出,例如上面例子中用阶码表示-130,小于真值表示范围的最小值,发生下溢出。一般机器把下溢出时的值置为 0。
继续例题1中阶码未溢出,无需处理,则
x + y =2^( 1*0100) * (11.010010)
将补码化为带符号原码
x + y = 2^(-1100) * (-0.101110)
再来一道例题直接算
例6. x=2^1010*0.1101, y=2^1011*0.1111,求x+y
-
补码表示:x为01010;00.1101
-y为01011;00.1111 -
阶码对阶 :x阶码小一位,对阶后x为01011;00.0110(1)
-
尾数相加:
00.0110(1)
+00.1111
=01.0101(1) -
尾数规格:
右归一位;阶码加一
01100;00.1010(11) -
尾数舍入:
这里我们使用0舍1入法
00.1010(11) 转化为00.1011 -
阶码溢出:
这里阶码未溢出,结果为x + y = 2^01100 * (00.1011)
原码即 x + y = 2^1100 * (0.1011)
若是哪里有理解错误的或写错的地方,望各位读者评论或者私信指正,不胜感激。