簡體   English   中英

Java解析了39.4 GB以上的字節,出現了一個較長的var錯誤

[英]Java parse bytes number over 39.4 GB on a long var bug

我有一個獲取ftp磁盤空間的應用程序。 所以空間由一個數字表示,該數字表示多少字節。

問題是,當我獲得超過39.4 GB的空間時,我只能將39.4 * 1024 * 1024 * 1024存儲在長或雙倍的var中。 因此,如果您有50 GB,則顯示39.4。 解決方案是什么?

long可以存儲更大的值 -因此代碼中必須有一些特定的東西。 我猜到您的代碼在做什么,看看是否熟悉:

class Out {
    public static void main(String args[]) {
        long l = 40L * 1024 * 1024 * 1024;
        double d = 40.0 * 1024 * 1024 * 1024;
        System.out.println("long l: " + l + " double d: " + d + "\n");
        return;
    }
}

$ vim Out.java ; javac Out.java ; java Out 
long l: 42949672960 double d: 4.294967296E10

請注意,我必須乘以40L而不是僅乘以40如果所有整數都作為文字整數給出,而沒有特定的L long注解,則Java會將整個表達式解釋為int 在使用L和不使用L情況下進行測試(並乘以1024 * 1024 * 102 ,以證實我的假設),我發現其中的區別很有趣:

$ vim Out.java ; javac Out.java ; java Out # with only '40'
long l: -16777216 double d: 4.294967296E10

$ vim Out.java ; javac Out.java ; java Out # with '40L'
long l: 4278190080 double d: 4.294967296E10

我希望這有助於解釋為什么在代碼中指定文字數據類型的類型很重要。

這是用於存儲大於39.4 GB的容量的解決方案:

final long kb = 1024L;
final long mb = 1024L*kb;
final long gb = 1024L*mb;
long solution = 42L * gb;  // > 39.4 GB in a long

查看BigInteger類是否可以幫助您解決問題

http://download.oracle.com/javase/6/docs/api/java/math/BigInteger.html

編輯:

實際上,正如其他人已經提到的那樣,長值將能夠容納一個非常大的值,它可以容納遠遠超過40GB的數字值

long可以記錄8個Exa字節,即8 * 1024 * 1024 * 1024 GB(減去1個字節;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM