目录
- 一、补码加减运算
- 1.1 补码加减运算方法
- 1.2 补码加减运算的溢出判断
- 1.3 常用的判溢方法
- 二、机器数的移位运算
- 2.1 三种移位运算
- 2.2 补码的算术移位
- 三、移码加减运算
- 3.1 移码和移码计算
- 3.2 移码和补码混合计算
- 3.3 移码运算结果判溢
一、补码加减运算
求补运算:将原码包括符号位在内每一位取反,末位加1。1.1 补码加减运算方法
-
方法:
[ X + Y ] 补 = [ X ] 补 + [ Y ] 补 [ X − Y ] 补 = [ X ] 补 + [ − Y ] 补 \begin{aligned} [X+Y]_补&=[X]_补+[Y]_补\\ [X-Y]_补&=[X]_补+[-Y]_补 \end{aligned} [X+Y]补[X−Y]补=[X]补+[Y]补=[X]补+[−Y]补 -
使用补码进行加减运算,符号位和数值位一样参加运算;
-
补码的减法可以用加法来实现,任意两数之差的补码等于被减数的补码与减数相反数的补码之和。
1.2 补码加减运算的溢出判断
-
溢出:当运算结果超出机器数的表示范围时,称为溢出。计算机必须具备检测运算结果是否发生溢出的能力,否则会得到错误的结果。
-
对于加减运算,可能发生溢出的情况:同号(两数)相加,或者异号(两数)相减。
-
确定发生溢出的情况:
正数相加,且结果符号位为1;
负数相加,且结果符号位为0;
正数-负数,且结果符号位为1;
负数-正数,且结果符号位为0;
1.3 常用的判溢方法
- 单符号位判溢:当最高有效位产生的进位和符号位产生的进位不同时,加减运算发生了溢出。
- 双符号位判溢: X X X和 Y Y Y采用双符号位补码参加运算,正数的双符号位为 00 00 00,负数的双符号位为 11 11 11;当运算结果的两位符号 S f 1 S_{f1} Sf1、 S f 2 S_{f2} Sf2不同时( 01 01 01或 10 10 10),发生溢出。
二、机器数的移位运算
2.1 三种移位运算
移位 | 解释 |
---|---|
逻辑移位 | 将移位的数据视为无符号数据,各数据位在位置上发生了变化,导致无符号数据的数值(无正负)放大或缩小。 |
算术移位 | 将移位的数据视为带符号数据(机器数)。算术移位的结果,在数值的绝对值上进行放大或缩小,同时,符号位必须要保持不变。 |
循环移位 | 所有的数据位在自身范围内进行左移或者右移,左移时最高位移入最低位,右移时最低位移入最高位。 |
2.2 补码的算术移位
- 算术左移:符号位不变,高位移出,低位补0。
(1)为保证补码算术左移时不发生溢出,移位的数据最高有效位必须与符号位相同。
(2)在不发生溢出的前提下,用硬件实现补码的算术左移时,直接将数据最高有效位移入符号位,不会改变机器数的符号。 - 算术右移:符号位不变,低位移出,高位正数补0,负数补1,即高位补符号位。
三、移码加减运算
3.1 移码和移码计算
[ X ] 移 + [ Y ] 移 = 2 n + X + 2 n + Y = 2 n + [ X + Y ] 移 [ X ] 移 + [ − Y ] 移 = 2 n + [ X − Y ] 移 \begin{aligned} [X]_移&+[Y]_移=2^n+X+2^n+Y=2^n+[X+Y]_移 \\ [X]_移&+[-Y]_移=2^n+[X-Y]_移 \end{aligned} [X]移[X]移+[Y]移=2n+X+2n+Y=2n+[X+Y]移+[−Y]移=2n+[X−Y]移
3.2 移码和补码混合计算
[ X ] 移 + [ Y ] 补 = 2 n + X + 2 n + 1 + Y = 2 n + 1 + ( X + Y + 2 n ) = 2 n + 1 + [ X + Y ] 移 \begin{aligned} [X]_移+[Y]_补&=2^n+X+2^{n+1}+Y\\ &=2^{n+1}+(X+Y+2^n)\\ &=2^{n+1}+[X+Y]_移 \end{aligned} [X]移+[Y]补=2n+X+2n+1+Y=2n+1+(X+Y+2n)=2n+1+[X+Y]移
3.3 移码运算结果判溢
- 判断条件:当结果的最高符号位
S
f
1
=
1
S_{f1}=1
Sf1=1时溢出,
S
f
1
=
0
S_{f1}=0
Sf1=0时结果正确。
(1) S f 1 S f 2 = 10 S_{f1} S_{f2}=10 Sf1Sf2=10时,结果正溢出;
(2) S f 1 S f 2 = 11 S_{f1} S_{f2}=11 Sf1Sf2=11时,结果负溢出。 - 由于移码运算用于浮点数的阶码,当运算结果正溢出时,浮点数上溢;当运算结果负溢出时,浮点数下溢,当作机器零处理。