C++中的自动溢出检测?

6

可能是重复:
在C/C++中检测整数溢出的最佳方法

通常情况下,当我用C++编写大数字时,即使使用long long或其他64位数据类型,我也无法判断何时发生了溢出。是否有一种有效的方法能够检测溢出而不是通过观察错误值来实现呢?


1
你可以使用重载算术运算符的对象来代替使用原始整数值,当发生溢出时抛出异常。 - jamesdlin
2
你对这些数字进行了什么操作? - Baget
@Baget可以是任何东西。加法、减法、乘法、指数等等,这取决于程序。 - John Smith
2
在汇编语言中,您可以访问 CPU 的溢出位,但这显然取决于平台。 - bitmask
2个回答

2

标准C++可能不会提供太多帮助:

5 表达式

4 如果在表达式的计算过程中,结果在数学上没有定义或超出其类型可表示的范围,则其行为是未定义的。[注:大多数现有的C++实现忽略整数溢出。处理除以零、使用零除数形成余数和所有浮点异常的方法因机器而异,并且通常可以通过库函数进行调整。—end note]

你最好使用在 <cstdint> 中定义的标准固定宽度整数类型,如 uint32_t

还可以查看 <cerrno> 头文件,获取诸如 EOVERFLOW 的错误代码。 还有来自 <stdexcept>overflow_error/underflow_error 类。


EOVERFLOW 可以由库函数设置,但不会由算术运算设置。 - James Youngman

1

实际上,你甚至无法可靠地检测到溢出,因为有符号整数操作中的溢出会导致未定义的行为。如果编译器能够看到代码路径仅在溢出事件发生时到达,则允许完全优化它(因为在未定义的行为情况下,它可以做任何事情)。无符号类型不同,它们具有定义的溢出特性(执行模数算术)。

因此,检测有符号类型的溢出的唯一方法是事先进行适当的检查,这非常昂贵。几乎总是更有效的设计方式是确保您的算法的不变量确保不会发生溢出。

至于关于在发生可能的溢出之前检测的资源,请参见https://stackoverflow.com/a/199413/445525


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接