2016-01-29 124 views
1

如果intA * intB结果足够大,则会在2^31边界处溢出,您不会意外得到预期的结果。为什么这两行会产生不同的溢出行为?

int64_t value = (intA * intB) - int64A

然而,这产生了预期的值。

int value = (intA * intB) - int64A

这是怎么回事在较低水平,这意味着存储在一个int相同的(坏)操作做正确的事情,但在的int64_t它不?

回答

6

这是未定义的行为。 Signed overflow is undefined.未定义表示可能发生任何事情,包括程序工作正常。

要超越标准边界并解释未定义行为的特定实例行为方式,您需要低级别信息,如GCC版本和体系结构。

1

带符号整数溢出会导致未定义的行为。您可能会在您的机器上获得预期的价值,但不要依赖它。它可能会在其他机器上崩溃,或者给出错误的答案。

什么是有可能发生的是,你的机器上,int服从模运算模2^32的法律,从int64_tint转换简单地取余数模2^32(丢弃高序位)。因此,如果期望值适合于int,那就是您得到的值,但是如果将其存储在int64_t中,则高位是垃圾。

相关问题