在Objective-C中:
unsigned long t1 = 1310789847 * 1000;
Run Code Online (Sandbox Code Playgroud)
导致溢出并显示错误的结果。
我如何获得1310789847000?
结果不适合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位,但对于文字却无法做到这一点。