[英]Range of primitive type long in 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
。
相反,要么使i
很long
或使数字文字长:
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
。
选项:
i
long
long
修饰符L
添加到184528125
2 63不能被184528125整除。使用您的方法可以得到的最近数字是49983556906 * 184528125 = 9223372036694981250。
如果你Log.d(“”+ 0xFFFFFFFFFFFFFFFFL),你将获得2 63 -1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.