我在documentation中发现,长度范围是-2 ^ 63到2 ^ 63-1。
当我按周期运行时,我无法超过cca 2 000 000 000。
Log.d(TAG, "Long MAX = " + Long.MAX_VALUE);
for (int i = 1; i < 45; i++) {
long result = i * 184528125;
Log.d(TAG, "" + result);
}
输出为“Long MAX = 9223372036854775807”,图表中的结果值如下。
codingground.com上的示例Java项目是here。
我错过了什么?
答案 0 :(得分:4)
这一行错了:
long result = i * 184528125;
它将两个32位int
值相乘。结果将是32位int
(已溢出),然后转换为64位long
。
您想要进行64位乘法运算。将两个操作数中的一个设为long
。最简单的方法是在常量上使用L
后缀:
long result = i * 184528125L;
答案 1 :(得分:2)
你在这里做 int
数学:
long result = i * 184528125;
...因为i
是int
,默认情况下数字文字是int
。首先i * 184528125
发生,仅限于int
范围,然后结果(包装,如您所见)被提升为long
并分配给result
。
相反,要么使i
成为long
,要么将数字文字设为长:
long result = i * 184528125L;
// Note -------------------^
现在,乘法符合long
值,可以访问完整的long
范围。
答案 2 :(得分:2)
问题在于这一行:
long result = i * 184528125;
右侧以32位整数运算进行计算,因为两个运算数均为int
。然后 隐式转换为long
。要修复它,只需使RHS成为long
常数:
long result = i * 184528125L;
请注意,这类似于执行以下操作的常见问题:
int x = 1;
double d = x / 2; // d is 0, not 0.5...
答案 3 :(得分:1)
解决方案1:
通过将L
附加到数字末尾来使用long
literal:
long result = i * 184528125L;
解决方案2:
将for循环更改为:
for (long i = 0; i<45; i++){
这将确保您在执行此计算时至少有一个long
值:
long result = i * 184528125;//i is now a long
解决方案3:
将其中一个值转换为long
:
long result = i * (long)184528125;
答案 4 :(得分:1)
long result = i * 184528125;
上述声明是罪魁祸首。默认情况下,数值为int
。您还将i
定义为int
。
选项:
i
定义为long
long
修饰符L
添加到184528125
答案 5 :(得分:0)
2 63 不能被184528125整除。你的方法可以得到的最接近的数字是49983556906 * 184528125 = 9223372036694981250。
如果你Log.d(“”+ 0xFFFFFFFFFFFFFFFFL),你将获得2 63 -1