我正在编写一个 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
}
我的困惑是 else if 条件。 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 会说的那样) ,“嘿,我想我只是搞笑了!”)。
正确的做法是将三个值的单个加法操作简化为两个单独的加法操作。首先,添加 rd
和 rs
,并使用您已经定义的条件检查溢出。然后,取第一次加法的结果,加到进位,检查这里是否溢出。假设进位位为 0 或 1,第二个溢出检查可以非常简单。
如果确定第一个或第二个加法运算溢出,最终结果将设置溢出位。
关于c++ - 检查 addc 函数的溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36831432/