如果intA * intB结果足够大,则会在2 ^ 31边界溢出,并且您不会惊讶地得不到预期的结果。
int64_t value = (intA * intB) - int64A
然而,这会产生预期的价值。
int value = (intA * intB) - int64A
在低级别进行的是什么意味着存储在int中的相同(错误)操作是正确的,但在int64_t中却没有?
答案 0 :(得分:6)
这是未定义的行为。 Signed overflow is undefined.未定义意味着可能发生任何事情,包括工作正常的程序。
要超越标准边界并解释此特定未定义行为实例的行为方式,您需要低级信息,例如GCC版本和体系结构。
答案 1 :(得分:1)
有符号整数溢出会导致未定义的行为。您可以在您的机器上获得预期值,但不要依赖它。它可能会在其他机器上崩溃,或给出错误的答案。
可能发生的事情是您机器上的, int
遵守模数算术模2 ^ 32的定律,以及从int64_t
到{的转换{1}}简单地取余数为模2 ^ 32(丢弃高位)。因此,如果预期值符合int
,那就是您获得的值,但如果将其存储在int
中,则高位比特是垃圾。