Компилятор вроде бы с этим согласен (только шестнадцатеричные значения из одной цифры):
byte[] rawbytes={0xa, 0x2, 0xf};
Но не так:
byte[] rawbytes={0xa, 0x2, 0xff};
Я получаю« Возможную потерю точности » найдено: int required: byte "error?
Что я делаю не так - или шестнадцатеричные числа из одной цифры - особый случай?
Java 1.5.x.
Как уже было сказано в другом ответе, байт - это знаковый тип в Java. Его диапазон составляет от -128 до 127 включительно. Поэтому 0xff равно -0x01. Вы можете использовать 0xff вместо -0x01, если добавите ручное приведение:
byte[] rawbytes={0xa, 0x2, (byte) 0xff};
«0xFF» - это литерал int
для десятичного значения 255, которое не может быть представлено в виде байта.
На данный момент вам нужно преобразовать его в байт
, чтобы сообщить компилятору, что вы действительно имеете в виду -1, например:
byte[] rawbytes = { 0xA, 0x2, (byte) 0xFF };
Было предложено добавить новый синтаксис байтового литерала ( y
или Y
суффикс) на Java 7. Тогда вы могли бы написать:
byte[] rawbytes = { 0xA, 0x2, 0xFFy };
Однако это предложение не было включено в "комплексное предложение" для улучшенных интегральных литералов ", поэтому мы навсегда застряли в приведении типов.
байт
подписан, а 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);
}