Java中原始类型的范围

时间:2015-02-04 15:25:23

标签: java

我在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”,图表中的结果值如下。

graph of previous for cycle

codingground.com上的示例Java项目是here

我错过了什么?

6 个答案:

答案 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;

...因为iint,默认情况下数字文字是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

选项:

  1. i定义为long
  2. long修饰符L添加到184528125

答案 5 :(得分:0)

2 63 不能被184528125整除。你的方法可以得到的最接近的数字是49983556906 * 184528125 = 9223372036694981250。

如果你Log.d(“”+ 0xFFFFFFFFFFFFFFFFL),你将获得2 63 -1