Java анализирует количество байтов более 39,4 ГБ при ошибке с длинным var

#java #math

#java #математика

Вопрос:

У меня есть приложение, которое получает место на диске ftp. итак, пространство задается числом, которое показывает, сколько байт.

проблема в том, что когда у меня есть место более 39,4 ГБ, я могу просто хранить 39.4*1024*1024*1024 в длинной или двойной переменной. итак, если у вас есть 50 ГБ, он просто покажет вам 39,4. каково решение?

Комментарии:

1. К сожалению, я не могу понять ваш вопрос. Не могли бы вы, пожалуйста, вставить свой код, его выходные данные и то, каким вы ожидали его получить? Спасибо

2. Вы, должно быть, делаете что-то не так. В long вы, вероятно, сможете хранить размеры примерно до 2 ^ 33 или 16 миллиардов гигабайт

3. Как сказал Ingo, вы должны быть в состоянии уместить количество байтов в 39,4 ГБ в 64-разрядное целое число длиной в несколько сотен миллионов раз…

4. Вы, должно быть, делаете что-то неправильно, но пока вы не покажете код, подтверждающий ваше утверждение, мы не можем сказать вам, что это.

5. @Ingo Длинные значения Java подписаны 64-разрядно, поэтому ограничение равно 2 ^ 63 — 1 (возможно, 33 в вашем комментарии были опечаткой?). Это около 8 миллиардов гигабайт (фактически на 1 байт меньше 8 эксабайт — или эксбибайт, если вы предпочитаете странные имена).

Ответ №1:

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 и без 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
  

Я надеюсь, это помогает объяснить, почему важно указывать типы литеральных типов данных в коде.

Ответ №2:

Вот решение для хранения объема, превышающего 39,4 ГБ:

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

Ответ №3:

Посмотрите, поможет ли класс BigInteger вам с вашей проблемой

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

Редактировать:

На самом деле, как уже упоминалось другими, long value сможет содержать действительно большое значение, оно может содержать гораздо больше, чем 40 ГБ в виде числового значения

Ответ №4:

long можно записать 8 Exa-байт, которые 8 * 1024 * 1024 * 1024 ГБ (минус один байт 😉