:
unsigned long t1 = 1310789847 * 1000;
导致溢出并显示错误的结果。
我如何获得1310789847000
?
答案 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。