试图在java中查找长数据类型的范围

时间:2014-03-31 10:37:24

标签: java

尝试验证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);
}
}

4 个答案:

答案 0 :(得分:7)

您的程序最终将 - 但它必须首先执行2次 63 次迭代(每个方向)。这需要很长时间。 Long.MAX_VALUELong.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_VALUELong.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);
}
}