目录
补码加减法运算
补码加减法
[x]补+[y]补=[x+y]补
[x]补+[-y]补=[x-y]补
特点:
使用补码进行加减运算,符号位和数值位一样参加运算。
补码的减法可以用加法来实现,任意两数之差的补码等于被减数的补码与减数相反数的补码之和 。 注意:该公式不适合任何其他机器数编码(原码、反 码、移码)。
求补运算[y]补~~~[-y]补
补码运算溢出
例:X=+1000,Y=+1001,求X+Y;
当运算结果超出机器数的表示范围时,称为溢出。
对于加减运算,可能发生溢出的情况:同号(两数) 相加,或者异号(两数)相减。
确定发生溢出的情况:
正数相加,且结果符号位为1;
负数相加,且结果符号位为0;
正数-负数,且结果符号位为1;
负数-正数,且结果符号位为0;
上图中要记住C1和Cf这两个进位信号,后面要用【V非常重要】
定点数阵列乘法
无符号位乘法
先转为补码运算,乘法再转为阵列加法
位积的每一位XiYj用一个与门产生。
每一次的累加都用单独一组FA实现。
本次累加的FA之间的进位,送至下一次再累加。
若A为m位二进制数,B为n位二进制数,即:
1.需要的与门个数:m*n;
2.进行串行加法需要的FA: m*n个;
3.进行并行加法需要FA: n*m个;
n*n位二进制乘法
则需要n*n个与门,n*(n-1)个FA
小结
定点运算器组成
基本组成包括:
算术逻辑运算单元ALU:实现算术运算和逻辑运算
寄存器数据的输入:一般用边沿工作方式。
寄存器数据的输出:一般用电平工作方式。
暂存器、缓冲器,都是用来存放参与计算的数据及运算结果,它只对硬件设计者可见,即只被控制器硬件逻辑控制或微程序所访问 ;
通用寄存器堆:用于存放程序中用到的数据,它可以被软件设计者所访问。
内部总线:用于连接各个部件的信息通道。
定点运算器总线结构
单总线(1)双寄存器
过程:
1.Ri→IB IB→LA (置入LA寄存器)
2.Ri→IB IB→LB (置入LB寄存器)
3.C_OP(控制ALU) ALU→IB IB→Ri (置入ALU计算,通过缓冲器【缓冲器作用不冲突总线】)
单总线(2)一个寄存器
过程
1.Ri→IB IB→LA (送入LA)
2.Ri→IB C_OP ALU→LC (直接送人ALU计算)
3.LC→IB IB→Ri C_OP (结果送入LC,LC接入总线)
双总线
太简单理解了,看图就能懂
三总线
浮点数加减法
必备补充知识
1. 定点小数补码:模为固定值 “2” ;
2. 正定点小数的补码:和真值形式完全一样;
3. 负定点小数的补码:模2+真值x,或者试用扫描法快速计算
4. 举例:真值x1=0.01011,x2=-0.01011,
[x1]补=0.01011 [x2]补=2-0.01011=1.10101
流程
对阶,规格化
右规
左规
舍入、判溢出
例子!非常有用!
自定义规格化的浮点数格式为:阶码 4 位,尾数 6 位,均用补码表示。
X=-0.10101*2^7,Y=110.11*2^3,应用浮点数加法/减法运算规则,计算 X+Y, X-Y 的真值及其浮点数结果。
(1)按浮点数格式要求,写出 X,Y 的浮点数存储格式:
[X]浮=0111 , 1.01011,[Y]浮=0110 , 0.11011
(2)对阶:[ΔE]补=Ex 补-Ey 补=Ex+(-Ey)补=0111+1010=0001,阶差的真值ΔE=1,说明 X 的阶
码比 Y 的大一,按照小阶向大阶码看齐,Y 的阶码加 1,其尾数右移 1 位(带符号位的右移),
得[Y]浮=0111 , 0.01101(1)
(3)尾数运算:
[M 和]补=Mx 补+My 补=1.01011+0.01101(1)=1.10000(1) V 尾=0⊕0=0
[M 差 1]补=Mx 补+(-My)补=1.01011+1.10010(1)=10.11101(1)
或者
[M 差 2]补=Mx 补+(-My)补=1.01011+1.10011(1)=10.11110(1) V 尾=1⊕0=1
(4)尾数规格化
[M 和]补的规格化:因为 V 尾=0,所以不需要右规;
又因为其符号位跟最高数码位相同,所以需要左规,直到尾数的符号位跟最高数码位相异,尾数左移1位,同时阶码减1得:[M和]补=1.00001,
[E 和]补=0111+[-1]补=0111+1111=0110,V 阶=1⊕1=0
[M 差]补的规格化:因为 V 尾=1,所以需要右规——尾数右移 1 位,同时阶码加 1,得:
[M 差 1]补=1.01111(11),或者[M 差 2]补=1.01111(01);[E,差]补=0111+[1]补=1000,V 阶=1⊕0=1
(5)舍入处理
采取 0 舍 1 入的方式(多余位的最高位为 1 就在舍去时往前面进 1):
[M 差 1]补=1.01111+2^(-5)=1.10000,故尾数需要再度向左规格化 1 位,同时阶码减 1,得
[M 差1]补=1.00000,但是由于 V 阶=1 已经发生了溢出,无法正确进行阶码减 1;
[M 差 2]补=1.01111
采取 0 舍 1 入的方式(多余位的最高位为 1,若尾数真值为正就在舍去时往前面进 1,反之
就直接舍去多余的位):[M 差 1]补=1.01111; [M 差 2]补=1.01111+2^(-5)=1.10000,故尾数需
要再度向左规格化 1 位,同时阶码减 1,得[M 差 1]补=1.00000,但是由于 V 阶=1 已经发生
了溢出,无法正确进行阶码减 1。
(6)结果的溢出判断
浮点数加法运算:V 阶=0,结果没有溢出,[X+Y]浮=0110,1.00001
浮点数减法运算:V 阶=1,结果溢出
总结自定义浮点数加减法:
第一步:写出浮点数的二进制
(根据题目要求,尾数与阶码各不相同要求,一般来说。。尾数是补码)
第二步:对阶
PS:打一个比喻,就是假如101.02+0.04这两个数,起码也得整成101.02+000.04这样竖式加法运算会比较好看,其实就是对齐小数点
对阶的主要作用是把两个浮点数的阶码整成一样,若两个浮点数的阶码一样就不用进行对阶操作,若两个浮点数的阶码不一样的话。。。(进行对阶,1.小阶对(准)大阶[减少误差],适当进行2.右移(针对尾数的,因为我们操作了阶码,这时候也要操作阶码了)
记住,尾数就只有右移,左移的话就相当于大阶对(准)小阶,大错特错)
怎么判断哪个对哪个,用3.△E来判断,△E=Ex-Ey;
那怎么样尾数右移呢,符号位是0时,右移就补0,符号位是1时,右移就补1
PS:1.0101一一>1.1101(01) 【右移了两位】
0.1101一一>0.0011(01) 【右移两位】
你会发现括号里面的要干什么,其实在后面的舍入处理,左规会非常重要
第三步:尾数运算
尾数运算其实就要做两步:
1.直接加减,减法就是1.把 -[X]补 化成 [-X]补再相加;这个过程其实就是取反加1(符号位也要取反)
然后符号位溢出了的话。。。还是继续写上去,后面要用的,还有就是第二步因为右移的括号也要在加减运算中保留下来
[M 和]补=Mx 补+My 补=1.01011+0.01101(1)=1.10000(1) V 尾=0⊕0=0
[M 差 1]补=Mx 补+(-My)补=1.01011+1.10010(1)=10.11101(1)
2.判断V尾,这个V尾要在尾数规格化要用,V尾其实是溢出标志,V尾要在后面尾数规格化的右规时候要用(
如果说V尾=0,且符号位为两位时(x,y补都只有一个符号位),这时候扔掉符号位最高位即可
V尾=1,符号位为两位时,这时候符号位保留,等到后面的尾数规格化(右规)会处理。
例如:
[M 和]补=[Mx]补+[My]补=1.10100(0)+1.01011=1 0.11111(0),V 尾=1⊕0=1,模上进位保留,
[M 差]补=[Mx]补+[-My]补=1.10100(0)+0.101001=1 0.01001(0),V 尾=1⊕1=0,模上进位扔掉,[M 差]补=0.01001(0)
),V尾和整个数的溢出没有关系
3.V尾=符号位上的进位信号 ⊕ 尾数最高位(除去符号位)进位信号;
第四步:尾数规格化
因为尾数加减可能会出现尾数溢出或者是尾数绝对值小于2^-1(太小了)
所以针对这两种不同的情况有不同的做法【右规与左规】,左规右规的同时阶码也要改变
尾数溢出情况:
即1.当第三步中的V尾=1时,这时候要进行右规,右规只要右规一次!!!死记
符号位产生的进位Cf右移入最高符合位位置, 然后阶码加1,并计算溢出标志V阶码的值。
尾数绝对值过小[符号位与尾数最高有效位相同时]:
可以左规多次,下图说直到V阶=1(不是V尾)时说明都已经溢出了,那还有什么计算的必要。。。
左规会用到第一步右移括号()里面的数
第五步:舍入处理
在右移、右规操作之后,需要把尾数超出的低位部分截去
0舍1入的方式:
尾数是正,被截部分非0且最高位是1,丢掉多余位,往前进1;
尾数是负,被截部分非0且最高位是0,丢掉多余位,往前进1;
其它情况,直接丢掉多余的部分。
第六步:判断溢出
判断阶码是否溢出
根据阶码运算过程中V阶码的值判断
V阶= 1
若 V阶码=1且Cf=1: 阶码上溢,则浮点数上溢 【Cf为尾数符号位上的进位】
V阶码=1且Cf=0: 阶码下溢,则浮点数为机器零
V阶= 阶码符号位上的进位信号 ⊕ 阶码最高位(除去符号位)进位信号