如果intA * intB结果足够大,则会在2^31边界处溢出,您不会意外得到预期的结果。为什么这两行会产生不同的溢出行为?
int64_t value = (intA * intB) - int64A
然而,这产生了预期的值。
int value = (intA * intB) - int64A
这是怎么回事在较低水平,这意味着存储在一个int相同的(坏)操作做正确的事情,但在的int64_t它不?
如果intA * intB结果足够大,则会在2^31边界处溢出,您不会意外得到预期的结果。为什么这两行会产生不同的溢出行为?
int64_t value = (intA * intB) - int64A
然而,这产生了预期的值。
int value = (intA * intB) - int64A
这是怎么回事在较低水平,这意味着存储在一个int相同的(坏)操作做正确的事情,但在的int64_t它不?
这是未定义的行为。 Signed overflow is undefined.未定义表示可能发生任何事情,包括程序工作正常。
要超越标准边界并解释未定义行为的特定实例行为方式,您需要低级别信息,如GCC版本和体系结构。
带符号整数溢出会导致未定义的行为。您可能会在您的机器上获得预期的价值,但不要依赖它。它可能会在其他机器上崩溃,或者给出错误的答案。
什么是有可能发生的是,你的机器上,int
服从模运算模2^32的法律,从int64_t
到int
转换简单地取余数模2^32(丢弃高序位)。因此,如果期望值适合于int
,那就是您得到的值,但是如果将其存储在int64_t
中,则高位是垃圾。