Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的长基元类型范围_Java - Fatal编程技术网

Java中的长基元类型范围

Java中的长基元类型范围,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

我发现在这个范围内,长距离是从-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<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
a
long
或将数值文本设置为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。我知道有一些非常基本的问题。有时你必须闭上眼睛数到十