定点加减法
- [ X + Y ] 补 = [ X ] 补 + [ Y ] 补 [X+Y]_补=[X]_补+[Y]_补 [X+Y]补=[X]补+[Y]补
- [ X − Y ] 补 = [ X ] 补 − [ − Y ] 补 [X-Y]_补=[X]_补-[-Y]_补 [X−Y]补=[X]补−[−Y]补
- -Y补码的生成:从右至左扫描,0跳过,遇见1,从下一位开始取反.
定点加减法的溢出检测
原理:如果两正数相加结果是负数或两负数相加结果是正数,则发生溢出.
无符号溢出
- 加法溢出应用最高进位.
- 减法溢出用进位取反.
有符号溢出
- 略.
- OVERFLOW=C0+C1.即最高数据进位和符号位进位.
其他
- 变形补码:采用双符号位的补码.在运算时,如果出现10或01的符号位就是溢出.10是下溢.01是上溢.
- 逻辑左:最高位进CF,低位补0;右: 高位补0 低位截断
- 算术左:同逻辑左;右:符号位不变并COPY右移,低位移除(=/2)
运算器设计
串行进位加(减)法器
- 略.
- 减法的设定:Y在输入前和算符指示位P异或,同时P作为最低位的进位输入.
先行进位加(减法)器
C i + 1 = A i B i + ( A i + B i ) C i C_{i+1}=A_iB_i+(A_i+B_i)C_i Ci+1=AiBi+(Ai+Bi)Ci
G i = A i B i + A i B i G i − 1 P = ∑ ( A i + B i ) G_i=A_i B_i+A_iB_iG_{i-1}\\ P=\sum (A_i+B_i) Gi=AiBi+AiBiGi−1P=∑(Ai+Bi)
原码一位乘
- *0=+00000 *1=+X
while(! Reach_to_the_top)
{
Result_Temp+=Calculate(X,Y_lowest);
Rightmove(Result_Temp);
Rightmove(Y);
}
补码乘法器
[
X
⋅
Y
]
补
=
[
X
]
补
×
∑
(
Y
i
+
1
−
Y
i
)
⋅
2
−
i
[X\cdot Y]_补=[X]_补\times \sum (Y_{i+1}-Y_i)\cdot 2^{-i}
[X⋅Y]补=[X]补×∑(Yi+1−Yi)⋅2−i
符号位参与运算.
从
Y
0
=
0
Y_0=0
Y0=0开始.
- i f Y i + 1 Y i = 10 if Y_{i+1}Y_i=10 ifYi+1Yi=10,部分积+ [ X ] 补 [X]_补 [X]补,部分积和称数均右移.
- i f Y i + 1 Y i = 01 if Y_{i+1}Y_i=01 ifYi+1Yi=01,部分积+ [ − X ] 补 [-X]_补 [−X]补,部分积和称数均右移.
- i f Y i + 1 Y i = 11 / 00 if Y_{i+1}Y_i=11/00 ifYi+1Yi=11/00,部分积+0,部分积和称数均右移.
- 最后一步不移位.
- 部分积的移位移入乘数SEG.当乘数SEG没有乘数之后停止计算.
Ref:https://blog.youkuaiyun.com/liuchuo/article/details/52921504
比如x = -0.1101,y=0.1011
先写出x的补码:[x]补 = 11.0011,再写出-x的补码:[-x]补 = 00.1101
一开始部分积的初值是:00.0000
在y后面加个0~那么y变成了0.10110
然后从y的最后两位开始往前,0.10110当前最后两位是10,所以加上[-x]补:
00.0000 + 00.1101 = 00.1101
右移一位,变成00.01101
此时y =0.10110的最后两位变成了11(是往前挪了一个位置哦,不是两个~),按照规则应该直接右移一位就好啦,就变成了00.001101
此时y =0.10110的最后两位变成了01,所以根据规则要加[x]补:
00.001101 + 11.0011 = 11.011001
右移一位,变成了11.1011001
此时y =0.10110的最后两位变成了10,加上[-x]补:
11.1011001 + 00.1101 = 00.1000001
右移一位,变成了:00.01000001
此时y =0.10110最后两位是01(所以从这里就可以知道规则里面要在y前面补一个0的作用了吧嘿嘿),加[x]补:
00.01000001 + 11.0011 = 11.01110001
因为这已经是最后一步了,所以不用再右移了,所以最后结果就是1.01110001
这个结果是x*y的补码哦~
阵列乘法器
原码一位除:恢复余数法
试减:如果余数小于0则恢复并置商=0否则置1不恢复.
浮点数运算
规格化:00.1or11.0
- 对阶
- 尾数加减
- 规格化
- 舍入
- 溢出处理