5. 运算方法
先来讲一讲各种码吧;
原码、补码、反码、移码
-
原码
0,xxx;0表示正数,xxx为绝对值的二进制形式;
1,xxx;1表示负数,xxx为绝对值的二进制形式;
注意:-1的小数形式没有原码;如-1.000没有原码表示 -
补码


通过原码求解补码有一种简便的方式:
a. 看正负,如果为正,则补码就是原码;如果为负,转到步骤b;
b. 原码从右数起,到第一个1为止,这个1之前的,除了符号位以外的所有数取反; -
反码
对于负数:原码除了符号位以外,各位取反; 对于整数:反码就是原码;
Tips:
y
[
补
]
→
(
−
y
)
[
补
]
→
{
连
同
符
号
位
在
内
,
对
y
[
补
]
每
一
位
取
反
,
末
位
加
一
}
y_{[补]}\rightarrow (-y)_{[ 补]}\rightarrow \{连同符号位在内,对y_{[补]}每一位取反,末位加一\}
y[补]→(−y)[补]→{连同符号位在内,对y[补]每一位取反,末位加一}
- 移码

注意:补码与移码只差一个符号位;
由于移码恒大于等于0,且最小真值的移码为0,因此,移码可用于表示浮点数的阶码;
Tips:
移码与补码对比

- 易错点小结
- 只有补码及移码能够唯一表示0
- 原码不能表示 -1的小数形式
- 在码制相互转换时,首先看符号
浮点数

千万不要将浮点数的范围与机器表示的浮点数(或者明确指明补码表示)范围混淆
- 前者按照正常数学上的理解来做,例如:

注意,这里我们就拿最小负数为例,为什么是 − ( 1 − 2 − n ) -(1-2^{-n}) −(1−2−n)而不是 − 1 -1 −1,这就是因为这里所谓的浮点数的范围是在人、数学层面上的,而不是计算机层面上的。 - 后者为计算机补码表示,其表示范围与前者存在差异,例如

算术移位
在符号位不变的情况下:
- 先看符号,如果是正数,那么无论怎么移位,均填补0;
- 如果是负数,则:
- 原码:无论左移还是右移,均填补0;
- 补码:左移填补0,右移填补1;
- 反码:均填补1;
加减法运算

- 溢出判断
- 单符号位判断

- 双符号位判断
两位相同即未溢出,不同即溢出,其中,最高位代表该数真正的符号
- 单符号位判断
乘法运算
原码一位乘
- 符号单独运算,数值用绝对值计算。
- 以右移次数为乘法运行结束标志,一般来说为乘数的位数。
- 例子

Booth算法(补码乘法)
- 看
y
n
+
1
−
y
n
y_{n+1}-y_{n}
yn+1−yn,满足:

- 移位次数仍然是n次,移位完毕再加则算法结束;
- 移位作算术移位,因为是补码运算;
- 增加附加位 y n + 1 = 0 y_{n+1}=0 yn+1=0;
- 硬件实现:

注意,X是被乘数寄存器,不需要移位逻辑,Q是乘数寄存器,需要补充附加位0;
除法运算
推荐使用加减交替法计算,方便简单
恢复余数法
- 先加 [ − y ∗ ] 补 [-y^*]_{补} [−y∗]补试商,如果余数为正,上商1,直接逻辑左移,继续加上 [ − y ∗ ] 补 [-y^*]_{补} [−y∗]补试商;如果余数为负,先上商0,再加上 [ y ∗ ] 补 [y^*]_{补} [y∗]补恢复余数( y ∗ y^* y∗代表 y y y的绝对值)
- 左移n次,上商n+1次;
加减交替法
- 如果余数为正,则上商1,向左移一位,加上 [ − y ∗ ] 补 [-y^*]_{补} [−y∗]补;
- 如果余数为负,则上商0,向左移一位,加上 [ y ∗ ] 补 [y^*]_{补} [y∗]补;
- 一开始要用 [ − y ∗ ] 补 [-y^*]_{补} [−y∗]补试商
- 左移n次,上商n+1次;
- 硬件配置:

浮点数运算
- 对阶
原则: 小阶向大阶看齐; - 规格化

需要记住补码、反码第一二位相反,真值和原码第二位为1即可 - 尾数求和
尾数补码运算,规则和前面一致; - 左规和右规
双符号位相同左规,不同右规;
799

被折叠的 条评论
为什么被折叠?



