如何在Objective-C中将大数字相乘?

时间:2011-07-16 04:30:40

标签: objective-c math

Objective-C中的

unsigned long t1 = 1310789847 * 1000;

导致溢出并显示错误的结果。

我如何获得1310789847000

2 个答案:

答案 0 :(得分:5)

结果不适合32位无符号长整数,因此得到溢出,结果只有“底部”32位。您可以使用无符号长long,即64位(在Intel Mac上,不确定其他平台)。

unsigned long long t1 = (unsigned long long)1310789847 * 1000;

64位整数文字由L指定,因此您也可以这样做:

unsigned long long t1 = 1310789847L * 1000;

由于您正在处理文字,以上情况属实。我刚刚发现,对于变量,不需要强制转换(Xcode 4):

unsigned long a = 1310789847;
unsigned long b = 1000;
unsigned long long t1 = (unsigned long long)a * b; 
unsigned long long t2 = a * (unsigned long long)b;
unsigned long long t3 = a * b;
unsigned long long t4 = 1310789847 * 1000;
NSLog(@"%lld %lld %lld %lld\n", t1, t2, t3, t4);

输出结果为:

2011-07-16 08:33:40.445 LongLongTest[16738:903] 1310789847000 1310789847000 1310789847000 824821720

FWIW,我很惊讶编译器注意到在进行乘法之前必须将操作数扩展到64位,但对文字不能这样做。

答案 1 :(得分:5)

使用NSDecimal。在Foundation框架中有各种handy functions用于操作NSDecimal结构,它们基本上是超大数字(不仅仅是整数)。您可以获得加,减,乘,除,取幂等基本操作,但这些操作通常足以执行quite a bit of stuff