Java中的长基元类型范围
我发现在这个范围内,长距离是从-2^63到2^63-1 当我运行这个循环时,我无法超过CCA2000Java中的长基元类型范围,java,Java,我发现在这个范围内,长距离是从-2^63到2^63-1 当我运行这个循环时,我无法超过CCA2000 Log.d(TAG, "Long MAX = " + Long.MAX_VALUE); for (int i = 1; i < 45; i++) { long result = i * 184528125; Log.d(TAG, "" + result); } Log.d(标记“Long MAX=“+Long.MAX_值”); 对于(int i=1;i
Log.d(TAG, "Long MAX = " + Long.MAX_VALUE);
for (int i = 1; i < 45; i++) {
long result = i * 184528125;
Log.d(TAG, "" + result);
}
Log.d(标记“Long MAX=“+Long.MAX_值”);
对于(int i=1;i<45;i++){
长期结果=i*184528125;
Log.d(标记“”+结果);
}
输出为“Long MAX=9223372036854775807”,图中的结果值如下
codingground.com上的示例Java项目是
我遗漏了什么?你在做int
数学:
long result = i * 184528125;
…因为i
是一个int
,默认情况下,数字文本是int
s。因此,首先发生i*184528125
,将其限制在int
范围内,然后结果(如您所发现的那样包装)被提升为long
,并分配给result
相反,将i
along
或将数值文本设置为long:
long result = i * 184528125L;
// Note -------------------^
现在乘法与long
值一起进行,可以访问完整的long
范围。这一行是错误的:
long result = i * 184528125;
它将两个32位int
值相乘。结果将是一个32位的int
(已溢出),然后将其转换为64位的长
您希望改为执行64位乘法。将两个操作数中的一个设为长
。最简单的方法是在常量上使用L
后缀:
long result = i * 184528125L;
long result = i * 184528125L;
问题在于这一行:
long result = i * 184528125;
由于两个操作数都是int
,因此右侧用32位整数算术计算。然后有一个到long
的隐式转换。要修复它,只需将RHS设置为long
常量:
long result = i * 184528125L;
long result = i * 184528125L;
请注意,这类似于执行以下操作的常见问题:
int x = 1;
double d = x / 2; // d is 0, not 0.5...
解决方案1: 通过在数字末尾附加
L
来使用a:
long result = i * 184528125L;
解决方案2:
将for循环更改为:
for (long i = 0; i<45; i++){
解决方案3:
将其中一个值强制转换为long
:
long result = i * (long)184528125;
263不能被184528125整除。使用您的方法可以获得的最接近的数字是49983556906*184528125=9223372036694981250
如果您记录.d(“+0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF代码> 上述说法就是罪魁祸首。默认情况下,数值为
int
。您还将i
定义为int
选项:
i
定义为long
long
修饰符L
添加到184528125
int*int
是int
。它不“知道”你将把它分配给long
或double
。当然,如果int*int
是long
,它会更有意义,但这是另一个故事。与问题无关:“我无法超过CCA200000”谢谢Jesper。我知道有一些非常基本的问题。有时你必须闭上眼睛数到十