【问题标题】:automatic overflow detection in C++? [duplicate]C ++中的自动溢出检测? [复制]
【发布时间】:2012-06-07 14:09:27
【问题描述】:

可能重复:
Best way to detect integer overflow in C/C++

通常,当我在 C++ 中使用大量数字编写代码时,我无法判断何时发生溢出,即使我使用的是 long long 或其他 64 位数据类型。有没有比目击错误值更有效的方法来检测何时发生溢出?

【问题讨论】:

  • 您可以使用具有重载算术运算符的对象,而不是使用原始整数值,这些运算符在发生溢出时会引发异常。
  • 你对数字做了什么操作?
  • @Baget 可以是任何东西。加法、减法、乘法、指数等。取决于程序。
  • 在 Assembler 中,您可以访问 CPU 的溢出位,但这当然取决于平台。

标签: c++ overflow


【解决方案1】:

您可能不会从标准 C++ 中获得太多东西:

5 种表达方式

4 如果在计算表达式的过程中,结果不是 数学定义或不在可表示值的范围内 它的类型,行为是未定义的。 [注:大多数现有 C++ 的实现忽略整数溢出。分裂的处理 乘以零,使用零除数形成余数,并且所有浮点数 点例外因机器而异,通常可以通过 库函数。 ——尾注]

您最好的选择可能是使用<cstdint> 中定义的标准固定宽度整数类型,例如uint32_t

查看<cerrno> 标头也可以查看EOVERFLOW 等错误代码。然后有来自<stdexcept>overflow_error/underflow_error 类。

【讨论】:

  • EOVERFLOW 可以通过库函数设置,但不能通过算术运算设置。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    相关资源
    最近更新 更多