我在目标C中乘以两个整数时遇到问题。当我将500乘以20000000并保存在一个长变量中并打印出来时,结果为 1410065408 。
int x = 500;
long myLongValue = x * 20000000;
NSLog(@" %lu",myLongValue);
我认为问题在于溢出整数,但我无法找到真正的理由。我尝试使用这些整数的乘法来找到真实结果10000000000。有可能吗?
答案 0 :(得分:2)
这里有溢出:unsigned int使用32位编码,因此最大值为2 ^ 32-1,4294967295.使用31位编码int(1位用于符号),最大值将是2147483647。
正如您在此处所看到的,33h位用于表示您的数字,因此您无法用int表示它。猜猜如果将此位设置为0,您将获得哪个数字? ;)
解决方案已编辑:即使您将结果分配给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