Objective c 整数乘法溢出

Objective c 整数乘法溢出,objective-c,integer,overflow,long-integer,Objective C,Integer,Overflow,Long Integer,在目标C中,我无法将两个整数相乘。当我将500与20000000相乘并保存在一个长变量中并打印时,结果是1410065408 int x = 500; long myLongValue = x * 20000000; NSLog(@" %lu",myLongValue); 我认为问题在于整数溢出,但我找不到真正的原因。我试图用这些整数的乘法求出1000000000的实际结果。有可能吗?这里有一个溢出:无符号int使用32位编码,因此最大值为2^32-14294967295。int使用31位编码

在目标C中,我无法将两个整数相乘。当我将500与20000000相乘并保存在一个长变量中并打印时,结果是1410065408

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

我认为问题在于整数溢出,但我找不到真正的原因。我试图用这些整数的乘法求出1000000000的实际结果。有可能吗?

这里有一个溢出:无符号int使用32位编码,因此最大值为2^32-14294967295。int使用31位编码(1位表示符号),最大值为2147483647

正如您在这里看到的,第33位用于表示您的数字,因此不能用int表示。如果将此位设置为0,猜猜您将得到哪个数字?;)

解决方案编辑:即使将结果赋给长值,结果也会首先存储到int中,因此在执行objC中的乘法之前,应将值强制转换为长值。此外,正如rmaddy在评论中所注意到的,使用
long
变量在32位体系结构中不起作用,因为
long
是使用4字节编码的。您应该改用
long
type,或者使用显式类型,如int32\u t和int64\u t

int x = 500;
long long myLongValue = (long long)x * 20000000;
NSLog(@" %llu",myLongValue);    // logs correctly 10000000000
您还可以将
x
直接声明为
long
变量

仅供参考:swift不如objC那么宽容,您的示例代码将因“超出范围”位而崩溃:

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

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

问题是关于Objective-C的。最好用Objective-C而不是Swift来发布答案。很抱歉,关于Swift的最后一段是为了说明这种新语言在运行时不太容易抛出错误,因为编译时会出现错误。好的,但对这个问题的实际回答将包括用适当的语言给出适当的解决方案。保持快速演示问题,但在Objective-C中添加解决方案以解决问题。objC中添加了答案:)奇怪。当我在第5代iPodtouch上运行发布的解决方案时,它仍然显示错误的答案。我需要更改
myLongValue
并将强制转换为
long
,以查看正确答案。