繁体   English   中英

Java中原始类型的范围

[英]Range of primitive type long in Java

我在文档中发现,long的范围是-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项目就在这里

我错过了什么?

这条线错了:

long result = i * 184528125;

它将两个32位int值相乘。 结果将是一个32位的int (已溢出),然后转换为64位long

你想要做64位乘法。 使两个操作数之一变long 最简单的方法是在常量上使用L后缀:

long result = i * 184528125L;

你做的int这里的数学:

long result = i * 184528125;

...因为i是一个int ,默认情况下数字文字是int 所以首先i * 184528125发生,仅限于int范围,然后结果(包装,如你所发现的)被提升为long并分配给result

相反,要么使ilong或使数字文字长:

long result = i * 184528125L;
// Note -------------------^

现在,乘法发生在long值,可以访问完整的long

问题是这一行:

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...

解决方案1:

通过在数字末尾附加L来使用long文字

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;

long result = i * 184528125;

上述声明是罪魁祸首。 默认情况下,数值为int 你也将i定义为int

选项:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM