Как байт хранится в целом числе - PullRequest
0 голосов
/ 17 марта 2012

В классе InputStream пакета java.io. *:

int read () генерирует IOException

read () возвращает байт, который находится в классе bytestream, но этохранится в целом числе, без каких-либо ошибок.

Почему это так ??и как это происходит.Помогите мне дизайн распределения памяти также

Ответы [ 3 ]

4 голосов
/ 17 марта 2012

Контекст задается javadoc, который говорит:

"Считывает следующий байт данных из входного потока. Байт значения возвращается как int в диапазоне 0до 255. Если байт недоступен, поскольку достигнут конец потока, возвращается значение -1. ​​"

Под капотом метод read также имеетвозвращаемый байт или поток находится в позиции EOF.Таким образом, возвращаемое значение может содержать 257 возможных состояний и (очевидно), которые не помещаются в byte.API справляется с этим, возвращая int, закодированный как указано в приведенном выше отрывке javadoc.

Я не смотрел на код, но ожидаю, что он выглядит примерно так:

    if (eof) {
        return -1;
    } else {
        // Casting to an int sign extends to 32 bits,
        // and we then take the bottom 8 bits.
        return ((int) someByte) & 0xff;
    }

И когда вы получите результат, вам нужно сделать что-то вроде этого:

    int res = is.read();
    if (res == -1) {
        // handle EOF case ...
    } else {
        byte b = (byte) res;
        // handle the byte ...
    }

Помогите мне с дизайном распределения памяти.

Нет проблем с выделением памяти.Типы byte и int являются примитивными типами.

2 голосов
/ 17 марта 2012

int в Java - 32 бита. byte в Java - 8 бит. Попробуйте следующий код:

byte foo = 5;
int intFoo = foo;

Java позволяет бесплатно выгружать примитивы, потому что при этом вы не теряете никакой информации.

1 голос
/ 17 марта 2012

Вы можете преобразовать бесплатно (от примитива, который использует меньше байтов к тому, который использует больше байтов), потому что вы не теряете информацию (вы можете поместить небольшую вещьбольшой контейнер).

Только когда вы понижаете (от примитива, который использует больше байтов, до того, который использует меньше байтов), вы должны явноприведение (когда вы кладете большую вещь в маленький контейнер, вы рискуете отрубить часть вещи, чтобы она подходила)

...