В Java, int
- 32 бита. A byte
равно 8 bits
.
Большинство примитивных типов в Java подписаны, а byte
, short
, int
и long
закодированы в двух дополнениях. (Тип char
не имеет знака, а понятие знака не применимо к boolean
.)
. В этой схеме номеров наиболее значимый бит указывает знак числа. Если требуется больше бит, самый старший бит («MSB») просто копируется в новый MSB.
Итак, если у вас есть байт 255
: 11111111
, и вы хотите представить его как int
(32 бита) вы просто копируете 1 влево 24 раза.
Теперь один из способов прочитать номер дополнения отрицательного двора - начать с младшего значащего бита, двигаться влево, пока не найдете первый 1, а затем инвертировать каждый бит впоследствии. Полученное число является положительной версией этого числа
Например: 11111111
переходит к 00000001
= -1
. Это означает, что Java будет отображаться как значение.
То, что вы, вероятно, хотите сделать, это знать значение unsigned байта.
Вы можете выполнить это с помощью битовой маски, которая удаляет все, кроме наименее значимые 8 бит. (0xff)
Итак:
byte signedByte = -1;
int unsignedByte = signedByte & (0xff);
System.out.println("Signed: " + signedByte + " Unsigned: " + unsignedByte);
Будет распечатан: "Signed: -1 Unsigned: 255"
Что на самом деле происходит здесь?
Мы используем побитовое И, чтобы замаскировать все посторонние знаковые биты (1 слева от наименее значимых 8 бит.) Когда int преобразуется в байт, Java прерывает левую часть, большинство 24 бит
1111111111111111111111111010101
&
0000000000000000000000001111111
=
0000000000000000000000001010101
Поскольку 32-й бит теперь является битом знака вместо 8-го бита (и мы установили бит знака равным 0, который является положительным), считываются исходные 8 бит из байта Java как положительное значение.