2014-03-31 51 views
1

試圖驗證在java中長的範圍..爲什麼這個程序不工作?它給出了無限循環(可能)。我沒有在命令行獲得輸出,並且光標保持閃爍。試圖找到在java中的長數據類型的範圍

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); 
} 
} 
+1

'Long.MAX_VALUE'太主流了嗎? –

+0

你可以使用Long.MAX_VALUE和Long.MIN_VALUE? – tristan2468

+0

您是否嘗試過調試您的程序? –

回答

7

你的計劃將努力最終 - 但它有先進行2次迭代(在每個方向)。這將需要很長時間。 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 
+0

但是'i> c'永遠不會'真的'..不是嗎? – Maroun

+2

@MarounMaroun它會溢出並變成負值。嘗試'Long.MAX_VALUE + 1',你會看到:) –

+0

的確..感謝 – Maroun

1

爲什麼你認爲你的程序是不正確?它只需要很長時間 - 直到長時間溢出(大約2^63次迭代)。我建議你使用Long.MIN_VALUELong.MIN_VALUE或者如果你想避免這個解決方案,當溢出發生時使用binary search

此外,您可能會考慮使用相同的程序short來驗證它是正確的,非常耗時。

0

您可以使用Long.MAX_VALUE和Long.MIN_VALUE

這將需要時間很多枚舉所有2^64個可能long值

0

沒有理由開始在0或-1。

如果您想驗證最小值/最大值,嘗試這樣的:

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); 
} 
}