c++ - 检查 addc 函数的溢出

标签 c++ integer-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
}

我的困惑是 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 会说的那样) ,“嘿,我想我只是搞笑了!”)。

正确的做法是将三个值的单个加法操作简化为两个单独的加法操作。首先,添加 rdrs,并使用您已经定义的条件检查溢出。然后,取第一次加法的结果,加到进位,检查这里是否溢出。假设进位位为 0 或 1,第二个溢出检查可以非常简单。

如果确定第一个或第二个加法运算溢出,最终结果将设置溢出位。

关于c++ - 检查 addc 函数的溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36831432/

相关文章:

python - Boost Python Exposing C++ class with constructor taking a std::list

c++ - 从只允许访问带索引的 vector 的对象创建 vector 包装器

c++ - Qt MySQL 查询 - 无法绑定(bind)值

c - python 中的整数溢出

c++ - (-2147483648> 0) 在 C++ 中返回 true?

C++ 对 WinMain@16 的 undefined reference (Code::Blocks)

c++ - 以编程方式实时更改音频文件的速度

python - 确保计算完成 64 位(或至少警告溢出)

python : overflow while subtraction

rust - Rust溢出时带边界的整数运算