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

时间:2012-06-02 19:52:30

标签: c++ overflow

  

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

通常,当我使用大数字在C ++中编写某些内容时,即使我使用的是长long或其他64位数据类型,我也无法判断溢出何时发生。有没有一种有效的方法来检测何时发生溢出而不是目击错误的值?

2 个答案:

答案 0 :(得分:2)

从标准C ++中可能没有太多东西:

  

5个表达

     

4 如果在评估表达式时,结果不是   在数学上定义或不在可表示值的范围内   它的类型,行为是未定义的。 [注:大多数现有   C ++的实现忽略整数溢出。治疗师   零,使用零除数形成余数,并且全部浮动   点异常因机器而异,通常可通过a调整   库函数。 - 后注]

最好的办法是使用<cstdint>中定义的标准固定宽度整数类型,例如uint32_t

请查看<cerrno>标题,了解EOVERFLOW等错误代码。然后是来自overflow_error的{​​{1}} / underflow_error个类。

答案 1 :(得分:1)

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

因此,检测带有签名类型的溢出的唯一方法是事先进行适当的检查,这非常昂贵。设计事物几乎总是更有效率,使得算法的不变量确保不会出现溢出。

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