Преобразование 0xFF дает мне -1 -> Подпись против Подпись?

1

Вот мой код:

byte[] cmd = new byte[19];
cmd[0] = (byte) 0xFF;
cmd[1] = (byte) 0x2C;
for (int i = 2;i < 19; i++) {
    cmd[i] = (byte) 0x00;   
}
cmd[18] = (byte) 0x00;
System.out.println("Command Send =>"+Arrays.toString(cmd));

Его показать мне для cmd [0] a -1 вместо 255. Я думаю, что мой компилятор принимает подписанный тип байта. Если я прав, можно использовать unsigned byte?

Теги:
hex
integer
signed
unsigned

3 ответа

3
Лучший ответ

Возможно, вы смущены различием между хранилищем и представлением.

Как говорили вам другие, Java использует только подписанные интегральные типы. В качестве байта используется только 8 бит, это означает, что у вас есть диапазон от -128 до 127. Но имейте в виду: это только десятичное представление, которое не говорит вам о двоичном хранилище!

Лучшим напоминанием для диапазона байтового типа Java будет следующее (десятичное) представление:

0 1 ... 126 127 -128 -127 ... -2 -1

Это непосредственно соответствует следующему двоичному представлению:

00000000 00000001 ... 11111110 11111111

Подписанное десятичное представление называется двумя дополнениями. Как вы можете видеть, двоичное значение 11111111, равное 0xFF, соответствует (подписанному) десятичному значению -1.

Если вы отправите это значение через поток, вы получите полное значение 0xFF, независимо от того, что вы видите на выходе программной консоли Java.

  • 0
    Хорошо, еще одна вещь: когда я делаю «outputStream.write (CMD1)» и CMD1 является байтом = 0xFF, что происходит на последовательном порте 255 или -1? Потому что, может быть, это просто Java-компилятор, который не переводит на консоль так, как я хочу, но когда я отправляю на порт com, он отправляет мне 255: /?
  • 0
    Фххх ... «-1» и «255» являются только представлениями для двоичного 11111111. Поэтому я рекомендую не думать в терминах «-1» или «255» (хотя размышления о 255 облегчают, я Угадай). Тем не менее, вы скоро поймете, что это «-1» или «255» не отправляются, но это битовый поток, состоящий из 8 установленных бит (1).
Показать ещё 1 комментарий
1

В byte типа Java подписывается, в java нельзя использовать "unsigned byte". Обходным путем было бы использование short типов

  • 0
    Хорошо, приятно это знать, но как я могу отправить «255» в моей переменной cmd [0]?
  • 0
    Ты не можешь Теперь вы говорите, что «отправляете» этот массив как «команду», вы можете «преобразовать» подписанный в беззнаковый в рецепторной части (выполнив int z = (0xFF & byte[x]) ) или отправить и получить short[] или int[] вместо byte[]
Показать ещё 1 комментарий
0

Каждый раз, когда вы работаете с байтовой переменной в Java, (byte) 0xFF будет неявно преобразован в (int) 0xFFFFFF (т.е. -1). Вы можете сделать 0xFFFFFF & 0xFF а затем вы получите (int) 255 по вашему желанию (вы никогда не сможете получить (byte) 255, только (int) 255).

Если вам нужно хранить только байты, неважно, как на экране выводится 0xFF, он по-прежнему (байт) 0xFF внутри. Если вам нужно работать с ними (по сравнению с int, добавлением, вычитанием, преобразованием в строку, печать на экране и в основном что-либо еще), тогда вам нужно знать, что они будут преобразованы в int 0xFFFFFF, который интерпретируется -1.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню