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

phi*_*l b 4 math objective-c

在Objective-C中:

unsigned long t1 = 1310789847 * 1000;
Run Code Online (Sandbox Code Playgroud)

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

我如何获得1310789847000

Rud*_*uis 5

结果不适合32位无符号长,因此您会发生溢出,并且结果只有“底部” 32位。您可以改用unsigned long long long,它是64位(在Intel Mac上,不确定其他平台)。

unsigned long long t1 = (unsigned long long)1310789847 * 1000;
Run Code Online (Sandbox Code Playgroud)

L指定了64位整数文字,因此您也可以执行以下操作:

unsigned long long t1 = 1310789847L * 1000;
Run Code Online (Sandbox Code Playgroud)

由于您正在处理文字,因此上述情况是正确的。我刚刚发现对于变量,不需要强制转换(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);
Run Code Online (Sandbox Code Playgroud)

输出为:

2011-07-16 08:33:40.445 LongLongTest[16738:903] 1310789847000 1310789847000 1310789847000 824821720
Run Code Online (Sandbox Code Playgroud)

FWIW,令我惊讶的是,编译器注意到在进行乘法运算之前必须将操作数扩展为64位,但对于文字却无法做到这一点。


Dav*_*ong 5

使用NSDecimal。在Foundation框架中,有各种方便的函数可用于操纵NSDecimal结构,这些函数基本上是超大数字(而不仅仅是整数)。您获得了加,减,乘,除,求幂等基本操作,但是这些操作通常足够强大,可以完成很多工作