定点加减运算(补码加减法及溢出检测)
2018-03-28 19:38
585 查看
本文只针对定点的加减运算(补码加减法实现),不涉及定点数的乘除运算以及浮点数运算
补码加法:[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
在定点整数机器中,数的表示范围为 |x|<(2n−1)|x|<(2n−1),若运算的过程中出现大于此字长绝对值的现象,则称之为”溢出”
但n位二进制补码数的表示范围是−2n−1−2n−1到2n−1−12n−1−1,详见https://blog.csdn.net/alinyua/article/details/79702879
可能出现溢出的情况:
两正数加,变负数,上溢(正溢)(大于机器所能表示的最大数)
两负数加,变正数,下溢(负溢)(小于机器所能表示的最小数)
检测方法
双符号位法
1.参与加减运算的数采用变形补码表示(正数的两个符号位是”00”,负数的两个符号位是”11”,尾数规则同补码)
2.连同符号位参与运算
3.根据两个符号位判断结果是否溢出(机器中用异或门判断)
例子:x=-1100,y=-1000,求x+y
[x]补=110100[x]补=110100
[y]补=111000[y]补=111000
[x]补+[y]补=101100[x]补+[y]补=101100
由于两个符号位出现”10”,表示下溢
单符号位法
连同符号位参与运算
分别求符号位产生的进位CfCf和最高有效位产生的进位C0C0
根据CfCf和C0C0判断结果是否溢出(机器中用异或门判断)
关于原码,反码,移码的概念和计算参考https://blog.csdn.net/alinyua/article/details/79702879
补码加减法
公式补码加法:[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
溢出检测
概念:在定点整数机器中,数的表示范围为 |x|<(2n−1)|x|<(2n−1),若运算的过程中出现大于此字长绝对值的现象,则称之为”溢出”
但n位二进制补码数的表示范围是−2n−1−2n−1到2n−1−12n−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]补=110100[x]补=110100
[y]补=111000[y]补=111000
[x]补+[y]补=101100[x]补+[y]补=101100
由于两个符号位出现”10”,表示下溢
单符号位法
连同符号位参与运算
分别求符号位产生的进位CfCf和最高有效位产生的进位C0C0
根据CfCf和C0C0判断结果是否溢出(机器中用异或门判断)
符号位进位CfCf | 最高位进位C0C0 | 结果 |
---|---|---|
0 | 0 | 正确(正数) |
0 | 1 | 上溢 |
1 | 0 | 下溢 |
1 | 1 | 正确(负数 |
相关文章推荐
- 补码加减运算及溢出判断
- 自己实现的原码、反码、补码、移码的表示与加减运算软件
- 原码反码补码加减运算
- 加减运算溢出公式及其举例
- 补码加减法判断进位判断是否溢出的总结
- 【计算机组成原理】定点乘法运算之补码一位乘法(Booth算法)
- 用补码表示整数及加减运算
- 补码运算中的溢出
- 2013-BIT程序设计 7. 四则运算之加减法 -- 高精度加减
- 原码、补码、运算(加减、异或)实例
- 【计算机组成原理】定点乘法运算之补码一位乘法(Booth算法)
- 补码运算溢出判断方法
- 补码运算溢出判断方法
- 原码、反码、补码之加减运算
- 用补码表示整数及加减运算
- Ecplses+axis+BPEL2.0实现:BPEL调用加减法的Web服务,进行加减运算
- 有符号整数加减溢出检测问题
- 汇编语言中加减法运算的溢出处理
- 补码:统一加减运算
- 补码的加减运算