检查 addc 功能的溢出

Checking overflow for addc function

本文关键字:溢出 功能 addc 检查      更新时间:2023-10-16

我正在编写一个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
}

你的第二个if陈述似乎是在进位可能是负数的印象下运行的,这应该是某些东西没有加起来的第一个线索(正如Foghorn Leghorn会说的那样,"嘿,我想我只是搞笑了!")。

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

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