Литеральный синтаксис Для массивов byte [] с использованием шестнадцатеричной записи ..?

Компилятор вроде бы с этим согласен (только шестнадцатеричные значения из одной цифры):

byte[] rawbytes={0xa, 0x2, 0xf};

Но не так:

byte[] rawbytes={0xa, 0x2, 0xff};

Я получаю« Возможную потерю точности » найдено: int required: byte "error?

Что я делаю не так - или шестнадцатеричные числа из одной цифры - особый случай?

Java 1.5.x.

47
задан monojohnny 9 November 2015 в 11:44
поделиться

3 ответа

Как уже было сказано в другом ответе, байт - это знаковый тип в Java. Его диапазон составляет от -128 до 127 включительно. Поэтому 0xff равно -0x01. Вы можете использовать 0xff вместо -0x01, если добавите ручное приведение:

byte[] rawbytes={0xa, 0x2, (byte) 0xff};
48
ответ дан 26 November 2019 в 19:45
поделиться

«0xFF» - это литерал int для десятичного значения 255, которое не может быть представлено в виде байта.

На данный момент вам нужно преобразовать его в байт , чтобы сообщить компилятору, что вы действительно имеете в виду -1, например:

byte[] rawbytes = { 0xA, 0x2, (byte) 0xFF };

Было предложено добавить новый синтаксис байтового литерала ( y или Y суффикс) на Java 7. Тогда вы могли бы написать:

byte[] rawbytes = { 0xA, 0x2, 0xFFy };

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

8
ответ дан 26 November 2019 в 19:45
поделиться

байт подписан, а 0xff = 255 слишком велик. Допустимый диапазон (-128 .. 127).

Пример кода:

public static void main(String[] args) {
    byte b = (byte) 0xff;    // = -1
    int i = b;               // = -1
    int j = b & 0xff;        // = 255

    System.out.printf("b=%s, i=%s, j=%s", b,i,j);
}
8
ответ дан 26 November 2019 в 19:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: