整数乘法溢出
Integer multiplication overflow
我在 Objective C 中将两个整数相乘时遇到问题。当我将 500 乘以 20000000 并保存在一个 long 变量中并打印它时,结果是 1410065408.
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
我在 Objective C 中将两个整数相乘时遇到问题。当我将 500 乘以 20000000 并保存在一个 long 变量中并打印它时,结果是 1410065408.
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