如何检测无符号整数溢出?

新手上路,请多包涵

我正在用 C++ 编写一个程序来查找 a b = c 的所有解决方案,其中 abc 一起使用所有数字 0-9 一次。该程序循环遍历 ab 的值,并且每次在 aba b 上运行一个数字计数例程,以检查是否满足数字条件。

但是,当 a _b_超出整数限制时,可能会生成虚假解。我最终使用以下代码检查了这一点:

 unsigned long b, c, c_test;
...
c_test=c*b;         // Possible overflow
if (c_test/b != c) {/* There has been an overflow*/}
else c=c_test;      // No overflow

有没有更好的方法来测试溢出?我知道有些芯片有一个在发生溢出时设置的内部标志,但我从未见过通过 C 或 C++ 访问它。


请注意已 签名int 溢出是 C 和 C++ 中未定义的行为,因此您必须检测它而不实际导致它。对于加法前的有符号整数溢出,请参阅 _在 C/C++ 中检测有符号溢出_。

原文由 Chris Johnson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 954
1 个回答

mozilla::CheckedInt<T> 为整数类型 T 提供溢出检查整数数学(在可用的情况下使用 clang 和 gcc 上的编译器内在函数)。该代码在 MPL 2.0 下并取决于三个( IntegerTypeTraits.hAttributes.hCompiler.h 以及其他标头专用 声明机制 Mozilla 专用非标准库标头.如果您导入代码,您可能想要替换断言机制。

原文由 hsivonen 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题