整数乘法溢出

Integer multiplication overflow

我在 Objective C 中将两个整数相乘时遇到问题。当我将 500 乘以 20000000 并保存在一个 long 变量中并打印它时,结果是 141006540​​8.

int x = 500;
long myLongValue = x * 20000000;
NSLog(@" %lu",myLongValue);

我认为问题出在整数溢出上,但我找不到真正的原因。我尝试使用这些整数的乘法来找到实际结果 10000000000。可能吗?

这里有一个溢出:unsigned int 使用 32 位编码,因此最大值将为 2^32-1,4294967295。int 使用 31 位编码(1 位用于符号),并且最大值为 2147483647。

这里可以看到,33h位是用来表示你的数字的,所以不能用int来表示。如果将此位设置为 0,猜猜你会得到哪个数字? ;)

SOLUTION EDITED :即使您将结果分配给一个 long 值,结果也会首先存储到一个 int 中,因此您应该在执行乘法之前将您的值转换为 long在对象中。此外,正如 rmaddy 在评论中注意到的那样,使用 long 变量在 32 位体系结构中不起作用,因为 long 是使用 4 字节编码的。您应该改用 long long 类型,或使用显式类型,例如 int32_t 和 int64_t.

int x = 500;
long long myLongValue = (long long)x * 20000000;
NSLog(@" %llu",myLongValue);    // logs correctly 10000000000

您也可以将 x 直接声明为 long long 变量。

仅供参考: swift 不像 objC 那样宽容,您的示例代码会因为 'out-of range' 位而崩溃:

let a:Int32 = 20000000
let b:Int32 = 500

let result = a*b                    // CRASH
let result2 = Int64(a)*Int64(b)     // OK