尝试验证java中的long范围..为什么这个程序不起作用?它给出了无限循环(可能)。我没有在命令行输出,光标一直闪烁。
class range
{
public static void main(String [] args)
{
long i;
for(i=0;;i++)
{
long c= (long)(i+1);
if(i>c) //upper_limit+1=lower_limit
break; // hence, at i=upper_limit c(=i+1) < i
}
System.out.println("upper ="+i);
for(i=-1;;i--)
{
long c=(long)(i-1);
if(i<c) //lowerlimit-1=upperlimit
break; //hence at i=lowerlimit c(=i-1)>i
}
System.out.println("lower ="+i);
}
}
答案 0 :(得分:7)
您的程序最终将 - 但它必须首先执行2次 63 次迭代(每个方向)。这需要很长时间。 Long.MAX_VALUE
和Long.MIN_VALUE
是找到这个问题的简单方法。或者只看JLS 4.2.1:
整数类型的值是以下范围内的整数:
...
对于
long
,从-9223372036854775808到9223372036854775807,包括
如果您希望看到您的程序找到正确的值,只需将其开始接近最终结果:
for(i=Long.MAX_VALUE - 10;;i++)
...
for(i=Long.MIN_VALUE + 10;;i--)
快速结束输出:
upper =9223372036854775807
lower =-9223372036854775808
答案 1 :(得分:1)
为什么你认为你的程序不正确?它只需要很长时间 - 直到很长时间溢出(大约2 ^ 63次迭代)。我建议您使用Long.MIN_VALUE
和Long.MIN_VALUE
,或者如果您想避免此解决方案,请在发生溢出时使用binary search。
此外,您可以考虑使用short
的相同程序来验证它是否正确,只是非常耗时。
答案 2 :(得分:0)
您可以使用Long.MAX_VALUE和Long.MIN_VALUE
枚举所有2 ^ 64个可能的长值需要花费大量时间
答案 3 :(得分:0)
没有理由从0或-1开始。
如果您想验证MIN / Max值,请尝试这样:
class range
{
public static void main(String [] args)
{
long i;
for(i=Long.MAX_VALUE;;i++)
{
long c= (long)(i+1);
if(i>c) //upper_limit+1=lower_limit
break; // hence, at i=upper_limit c(=i+1) < i
}
System.out.println("upper ="+i);
for(i=Long.MIN_VALUE;;i--)
{
long c=(long)(i-1);
if(i<c) //lowerlimit-1=upperlimit
break; //hence at i=lowerlimit c(=i-1)>i
}
System.out.println("lower ="+i);
}
}