Число байтов синтаксического анализа Java превышает 39,4 ГБ при длинной ошибке var - PullRequest
0 голосов
/ 12 мая 2011

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

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

Ответы [ 4 ]

3 голосов
/ 12 мая 2011

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 голосов
/ 12 мая 2011

Вот решение для хранения суммы, превышающей 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
1 голос
/ 12 мая 2011

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

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

РЕДАКТИРОВАТЬ:

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

0 голосов
/ 12 мая 2011

long может записать 8 Exa-байтов, что составляет 8 *1024* 1024 * 1024 ГБ (минус один байт;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...