我正在用 C++ 编写一个程序来查找 a b = c 的所有解决方案,其中 a 、 b 和 c 一起使用所有数字 0-9 一次。该程序循环遍历 a 和 b 的值,并且每次在 a 、 b 和 a 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 许可协议
mozilla::CheckedInt<T>
为整数类型T
提供溢出检查整数数学(在可用的情况下使用 clang 和 gcc 上的编译器内在函数)。该代码在 MPL 2.0 下并取决于三个(IntegerTypeTraits.h
、Attributes.h
和Compiler.h
以及其他标头专用 声明机制 Mozilla 专用非标准库标头.如果您导入代码,您可能想要替换断言机制。