一、前言
定点的加减运算是重点,也是难点。其中,由于计算机中不会用“反码”进行加减运算,因此我们不讨论反码。而原码的加减运算在考试中不做要求,我们只需稍加了解即可。
我们会重点总结补码的加减运算,及其溢出判断,梳理清楚,并且完全掌握。
要讲加减运算的时候,我们应从三个方面去看:(1)符号位如何判断? (2)数值位如何计算? (3)溢出情况的判断
二、原码的加减运算(了解)
原码的加减运算是需要单独考虑符号位的。
1. 原码的加法运算
如表所示(数值位都是对操作数的绝对值操作得来)
符号位 | 数值位 | 溢出情况 | |
正 + 正 | 正(0) | 绝对值相加 | 可能溢出 |
负 + 负 | 负(1) | 绝对值相加 | |
正 + 负 | 同 绝对值大 的数 | 大 - 小 |
2. 原码的减法运算
原码的减法运算思想:将其转变为等价的加法运算。即 将“减数”符号取反,转变为加法。
如,正 - 负 --》正 + 正。
为了便于理解,我们不妨假设x 为正数,-y 为负数。x - (-y) = x + y
而在计算机中我们要 -y 从变为 y 的方法是,将符号位取反。
三、补码的加减运算(重点!)
补码的加减运算不需要单独考虑符号位,直接带符号位计算,结果的符号位直接在运算中得出。
1. 补码加减运算规则
[A + B]补 = [A]补 + [B]补 [mod 2^(n+1) ]
[A - B]补 = [A]补 + [-B]补 [mod 2^(n+1) ] (设机器字长位 n + 1 )
注意:(1)符号位 与 数值位 一起参与运算,运算结果的符号位也在运算中直接得出。
(2)最终运算结果超出 n + 1 位的高位(溢出部分)直接丢弃。
(3)运算结果也是补码。注意有的题目要求真值的时候,需要先把运算结果转化为原码再来求。
(4)一些常用便捷转化方法:
负数原码<-->负数补码 转换便捷方法:找到最右边的1,其左边全部取反(除符号位外)。
(注意!正数的补码 = 正数的原码,千万不要把正数的补码也当成负数求了!)
[B]补 <--> [-B]补 转换便捷方法:找到最右边的1,其左边全部取反(包括符号位)。
(无论B是正数还是负数都可以这么转换,读者可以去自行验证一下)
2. 溢出判断
(1)溢出情况:同加异减(同号相加 或 异号相减)
- 正 + 正 才会 上溢:正 + 正 = 负
- 负 + 负 才会 下溢:负 + 负 = 正
(由于减法都可以转变为加法,所以最终可以总结为这两种溢出情况)
(2)溢出判断方法:三种方法
- a.采用一位符号位,根据(1)中 “正 + 正 = 负” 和“负 + 负 = 正”两种溢出情况判断。
- b.采用双符号位
- 无溢出:00(结果为正),11(结果为负)
- 正溢出:01
- 负溢出:10
- c.采用一位符号位,根据数值位的进位情况判断(异或)
- 无溢出:最高位 与 次高位 进位相同
- 溢出:最高位 与 次高位 进位相异
具体判别式见王道PPT(下图引用自王道ppt)
四、补充:无符号数的加减法运算
无符号数的加减法运算与上文中补码的加减运算原理几乎完全相同。
1. 无符号数加减运算规则
加法:直接加。
减法:被减数不变,减数变为其补数(方法与补码加减运算中的[B]补 <--> [-B]补 一模一样)。减 法变加法。
2. 溢出判断
(1)手算判断:n bit 无符号整数表示范围为 0 ~ 2^n - 1 。看结果是否超出此范围。
(2)计算机判断溢出的方法:加法进1,减法进0
加法溢出判断:最高位产生的进位为 1,则溢出。
减法溢出判断:减法变加法后,最高位产生的进位为 0,则溢出。
五、补充:模2补码、模4补码的概念
首先,模2补码就是单符号位补码,所谓模4补码就是双符号位补码。所谓模2,代表其所能表示的最大的数是1,因此只需要一位符号位即可。所谓模4,代表其所能表示的最大的数值是3,因此需要2位符号位表示,即双符号位。
双符号位(模4补码)在加减法中比单符号位(模2补码)更容易判断溢出,因为双符号位只要不同就表示溢出,非常直观。
需要注意的是,双符号位补码在存储的时候只需要一个符号位,因为作为一个合法的双符号位数,其两个符号一定都是相同的(能存储的补码一定是正确的,不正确的数据只会作为临时数据存在CPU中,不会真的存储)。但是双符号位补码在运算的时候需要两个符号位。
六、小结
(1)无论对于 补码加减运算 还是 原码加减运算,其思想都是将减法转变为加法。只是 原码 和 补码 减法转变为加法的方式不一样。
(2)原码减法-->加法:符号位取反
补码减法-->加法:[B]补 --> [-B]补
(3)补码的加减法不单独考虑符号位。
(4)原码和补码之间的转换、[B]补和 [-B]补之间的转换 的小tips要会用,经常会用到。
(5)溢出的判断经常考到,而又比较复杂,所以需要梳理清楚,不要记混了。