可能重复:
在 C/C++ 中检测整数溢出的最佳方法
通常,当我使用大量数字在 C++ 中编写某些内容时,我无法判断何时发生溢出,即使我使用的是 long long 或其他 64 位数据类型。有没有比目击错误值更有效的方法来检测何时发生溢出?
可能重复:
在 C/C++ 中检测整数溢出的最佳方法
通常,当我使用大量数字在 C++ 中编写某些内容时,我无法判断何时发生溢出,即使我使用的是 long long 或其他 64 位数据类型。有没有比目击错误值更有效的方法来检测何时发生溢出?
您可能不会从标准 C++ 中获得太多东西:
5 表达式
4如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。[注意:大多数现有的 C++ 实现忽略整数溢出。除以零的处理,使用零除数形成余数,所有浮点异常因机器而异,通常可以通过库函数进行调整。——尾注]
您最好的选择是使用标准的固定宽度整数类型,<cstdint>
例如uint32_t
.
还请查看<cerrno>
标题以获取错误代码,例如EOVERFLOW
. 然后有来自的overflow_error
/underflow_error
类<stdexcept>
。
实际上,您甚至无法在事后可靠地检测到溢出,因为有符号整数运算中的溢出会导致未定义的行为。如果编译器可以看到仅在发生溢出时才到达代码路径,则允许对其进行完全优化(因为在未定义的行为情况下它可以做任何事情)。无符号类型的不同之处在于它们定义了溢出特性(它们执行模运算)。
因此,检测带符号类型溢出的唯一方法是事先进行适当的检查,这非常昂贵。设计事物的效率几乎总是要高得多,这样您的算法的不变量就可以确保不会出现溢出。
至于在溢出发生之前检测可能的溢出的资源,请参阅https://stackoverflow.com/a/199413/445525