您的位置:首页 > 其它

定点加减运算(补码加减法及溢出检测)

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.根据两个符号位判断结果是否溢出(机器中用异或门判断)

符号位SF1符号位SF2结果
00正确(正数)
01上溢
10下溢
11正确(负数)
例子: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判断结果是否溢出(机器中用异或门判断)

符号位进位CfCf最高位进位C0C0结果
00正确(正数)
01上溢
10下溢
11正确(负数
关于原码,反码,移码的概念和计算参考https://blog.csdn.net/alinyua/article/details/79702879
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: