本文只针对定点的加减运算(补码加减法实现),不涉及定点数的乘除运算以及浮点数运算
补码加减法
- 公式
- 补码加法: [x+y]补=[x]补+[y]补 [ x + y ] 补 = [ x ] 补 + [ y ] 补
- 补码减法:
[x−y]补=[x]补+[−y]补
[
x
−
y
]
补
=
[
x
]
补
+
[
−
y
]
补
注意: [−y]补=[y]补 [ − y ] 补 = [ y ] 补 包括符号位取反且最末位加1,这里的取反是包括符号位的,与求反码的不同
- 例子
- 例1: x=-0.1011,y=0.0111,求
[x+y]补
[
x
+
y
]
补
[x]补=1.0101 [ x ] 补 = 1.0101
[y]补=0.0111 [ y ] 补 = 0.0111
[x+y]补=[x]补+[y]补=1.0101+0.0111=1.1100 [ x + y ] 补 = [ x ] 补 + [ y ] 补 = 1.0101 + 0.0111 = 1.1100 - 例 2: x=+0.11011,y=-0.11111,求
[x−y]补
[
x
−
y
]
补
[x]补=0.11011 [ x ] 补 = 0.11011
[y]补=1.00001 [ y ] 补 = 1.00001
[−y]补=0.11111 [ − y ] 补 = 0.11111
[x−y]补=[x]补+[−y]补=1.11010 [ x − y ] 补 = [ x ] 补 + [ − y ] 补 = 1.11010
- 例1: x=-0.1011,y=0.0111,求
[x+y]补
[
x
+
y
]
补
溢出检测
- 概念:
在定点整数机器中,数的表示范围为 |x|<(2n−1) | x | < ( 2 n − 1 ) ,若运算的过程中出现大于此字长绝对值的现象,则称之为”溢出”
但n位二进制补码数的表示范围是 −2n−1 − 2 n − 1 到 2n−1−1 2 n − 1 − 1 ,详见https://blog.csdn.net/alinyua/article/details/79702879 - 可能出现溢出的情况:
- 两正数加,变负数,上溢(正溢)(大于机器所能表示的最大数)
- 两负数加,变正数,下溢(负溢)(小于机器所能表示的最小数)
检测方法
双符号位法
1.参与加减运算的数采用变形补码表示(正数的两个符号位是”00”,负数的两个符号位是”11”,尾数规则同补码)
2.连同符号位参与运算
3.根据两个符号位判断结果是否溢出(机器中用异或门判断)符号位SF1 符号位SF2 结果 0 0 正确(正数) 0 1 上溢 1 0 下溢 1 1 正确(负数) 例子:x=-1100,y=-1000,求x+y
[x]补=110100 [ x ] 补 = 110100
[y]补=111000 [ y ] 补 = 111000
[x]补+[y]补=101100 [ x ] 补 + [ y ] 补 = 101100
由于两个符号位出现”10”,表示下溢单符号位法
- 连同符号位参与运算
- 分别求符号位产生的进位 Cf C f 和最高有效位产生的进位 C0 C 0
- 根据 Cf C f 和 C0 C 0 判断结果是否溢出(机器中用异或门判断)
符号位进位 Cf C f 最高位进位 C0 C 0 结果 0 0 正确(正数) 0 1 上溢 1 0 下溢 1 1 正确(负数
关于原码,反码,移码的概念和计算参考https://blog.csdn.net/alinyua/article/details/79702879