在 Objective-C 中:
unsigned long t1 = 1310789847 * 1000;
导致溢出并显示不正确的结果。
如何得到1310789847000
?
结果不适合 32 位无符号长整型,因此会发生溢出,并且结果只有“底部”32 位。您可以使用 unsigned long 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 位,但不能对文字执行相同的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)