为什么这两行产生不同的溢出行为?

时间:2016-01-29 19:40:04

标签: c++

如果intA * intB结果足够大,则会在2 ^ 31边界溢出,并且您不会惊讶地得不到预期的结果。

int64_t value = (intA * intB) - int64A

然而,这会产生预期的价值。

int value = (intA * intB) - int64A

在低级别进行的是什么意味着存储在int中的相同(错误)操作是正确的,但在int64_t中却没有?

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

可能发生的事情是您机器上的 int遵守模数算术模2 ^ 32的定律,以及从int64_t到{的转换{1}}简单地取余数为模2 ^ 32(丢弃高位)。因此,如果预期值符合int,那就是您获得的值,但如果将其存储在int中,则高位比特是垃圾。