整数乘法溢出

时间:2015-01-30 14:08:51

标签: objective-c integer overflow long-integer

我在目标C中乘以两个整数时遇到问题。当我将500乘以20000000并保存在一个长变量中并打印出来时,结果为 141006540​​8

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

我认为问题在于溢出整数,但我无法找到真正的理由。我尝试使用这些整数的乘法来找到真实结果10000000000。有可能吗?

1 个答案:

答案 0 :(得分:2)

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

enter image description here

正如您在此处所看到的,33h位用于表示您的数字,因此您无法用int表示它。猜猜如果将此位设置为0,您将获得哪个数字? ;)

enter image description here

解决方案已编辑:即使您将结果分配给long值,结果也会先存储到int中,因此您应该在objC中执行乘法之前将值转换为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宽容,并且您的示例代码会因为“范围超出”而崩溃。位:

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

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