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