第二章——运算方法和运算器
- 数据格式
1.定点数
通常为纯小数或纯整数
设x=xnxn-1…x2x1
其中xn为符号位,若为纯小数,则小数点在其后面eg:0.111 //0为符号位
纯小数表示的范围:0<=|x|<=1-2-n
纯整数表示的范围:0<=|x|<=2n-1
2.浮点数
浮点数有两种:规格化(IEEE754标准)和非规格化
规格化有符号位S、阶码E(a位,能表示的最大的数为c=2a-1,最小的数为d=2-a)、尾数M(b位)(!!!注意不同题目尾数M可能用原码可能用补码!!!)
最大正数:(1+1-2-b)2a(E最大,M最大)
最小正数:12d(E最大,M最大)
最大负数:-1*2d(E最大,M最大)
最小负数:-(1+1-2-b)2a(E最大,M最大)
符号位S:表示浮点数的符号
尾数M:小数点在尾数最高位前面eg:.111
阶码E:隐含方式(移码)表示数设e为浮点数的指数真值,e变成E时要加上偏移值(32位浮点数偏移值为127,64位浮点数偏移值为1023),具体看例子:
32位浮点数:(20.59375)10=(10100.10011)2=(1.101001124)2
e=4 E=e+127=4+127=(131)10=(1000001)2
所以20.59375的32位浮点数二进制表示为:
0100 0001 1010 0100 1100 0000 0000 0000
-
移码——补码符号位取反
-
定点加、减法
[x]补+[y]补=[x+y]补
[x-y]补=[x]补+[-y]补
- 溢出检测
双符号位法:
NO1.求出补码
NO2.补码前添加一位数,值和符号位相同
NO3.运算后,看前两位数,相同则没溢出,为01
则是正溢,10
则是负溢,最高位表示结果的正确符号
eg:
x=+1100 y=+1000
[x]补=001100 [y]补=001000
[x]补+[y]补=010100
前两个为01 正溢单符号位法:
设Cf为符号位产生的进位C0为最高有效位产生的进位
Cf=1,C0=0 则产生负溢
Cf=0,C0=1 则产生正溢
- 定点乘法 和平常使用的乘法差不多
- 除法(加减交替法)
计算x/y
NO1 求[|x|]补,[|y|]补,[-|y|]补
NO2 [|x|]补+[-|y|]补
NO3 看结果最高位,为1则商0,NO5做加法(+[|y|]补) 为0则商1,NO5做减法(+[-|y|]补)
NO4 判断是否求完最后一位商,没有的的话做NO4,求完了的话做NO6
NO5 余数向左移一位,不足位补0eg:上一步余数为10001 则向左移一位 得到00010
根据NO3判断做加法还是减法,运算后做NO3
NO6 根据NO3判断做加法还是减法,运算后得到余数r
- 浮点数的加减法
NO1 比较阶码大小,完成对阶(移动小数点,使阶码相等)
NO2 尾数相加减(和上面说的加减法相同)
NO3 尾数规格化(移动小数点,使尾数满足0.5<=|M|<1)
- 浮点数的乘除法
x=2E1 * Mx y=2E2 * My
x*y=2E1+E2 * (Mx * My)
x/y=2E1-E2 * (Mx / My)