检查addc函数的溢出

时间:2016-04-25 03:11:01

标签: c++ overflow

我正在编写一个C ++程序来模拟一个16位的虚拟机。我有一个功能' addc'我必须检查溢出。我对溢出的条件有点迷失。我知道当您添加2个正数并且得到负数时会发生溢出,或者当您添加2个负数并且得到正数时会发生溢出。但是,在我的函数addc中,我有3个数字我必须添加。我正确接近这个吗?

我的功能应该这样做:

寄存器目的地=寄存器目的地+寄存器源+进位

(rd = rd + rs + c)

到目前为止检查溢出,我有这个代码..

//Check when adding positive numbers gives negative result
//My carry bit is always positive (either 0 or 1)
if(rd >= 0 and rs >= 0 and c >= 0) and ((rd + rs + c) < 0)){
    //set overflow bit
}
else if( rd < 0 and rs < 0 and c < 0) and (rd + rs + c) > 0) ){
    //set overflow bit
}

我的困惑是因为其他条件。 C将始终为0或1,因此它永远不会进入else if循环,因此几乎没有理由使用else if循环。我这样做了吗?或者我是否必须将进位(c)添加到其中一个操作数(rd或rs)中,因此我只有两个操作数可供比较。喜欢这个?

else if( rd < 0 and ((rs + c) < 0)) and (rd + (rs + c)) > 0) ){
    //set overflow bit
}

1 个答案:

答案 0 :(得分:0)

事实上,你的第二个if声明似乎是在承载位可能是负面的情况下运作,这应该是第一个没有加起来的线索(正如Foghorn Leghorn所说的那样,“嘿,我想我刚搞笑了!“)。

执行此操作的正确方法是将三个值的单个添加操作简化为两个单独的添加操作。首先,添加rdrs,并使用您已定义的条件检查溢出。然后,取第一个加法的结果,并将其添加到进位,并在此处检查溢出。第二次溢出检查可以非常简单,因为进位位将为0或1。

如果确定第一个或第二个添加操作已溢出,则最终结果将设置溢出位。