可能是重复:
在C/C++中检测整数溢出的最佳方法
通常情况下,当我用C++编写大数字时,即使使用long long或其他64位数据类型,我也无法判断何时发生了溢出。是否有一种有效的方法能够检测溢出而不是通过观察错误值来实现呢?
可能是重复:
在C/C++中检测整数溢出的最佳方法
通常情况下,当我用C++编写大数字时,即使使用long long或其他64位数据类型,我也无法判断何时发生了溢出。是否有一种有效的方法能够检测溢出而不是通过观察错误值来实现呢?
标准C++可能不会提供太多帮助:
5 表达式
4 如果在表达式的计算过程中,结果在数学上没有定义或超出其类型可表示的范围,则其行为是未定义的。[注:大多数现有的C++实现忽略整数溢出。处理除以零、使用零除数形成余数和所有浮点异常的方法因机器而异,并且通常可以通过库函数进行调整。—end note]
你最好使用在 <cstdint>
中定义的标准固定宽度整数类型,如 uint32_t
。
还可以查看 <cerrno>
头文件,获取诸如 EOVERFLOW
的错误代码。 还有来自 <stdexcept>
的 overflow_error
/underflow_error
类。
实际上,你甚至无法可靠地检测到溢出,因为有符号整数操作中的溢出会导致未定义的行为。如果编译器能够看到代码路径仅在溢出事件发生时到达,则允许完全优化它(因为在未定义的行为情况下,它可以做任何事情)。无符号类型不同,它们具有定义的溢出特性(执行模数算术)。
因此,检测有符号类型的溢出的唯一方法是事先进行适当的检查,这非常昂贵。几乎总是更有效的设计方式是确保您的算法的不变量确保不会发生溢出。
至于关于在发生可能的溢出之前检测的资源,请参见https://stackoverflow.com/a/199413/445525