За исключением char
, все остальные числовые типы данных в Java подписаны.
Как сказано в предыдущем ответе, вы можете получить значение без знака, выполнив операцию and
с 0xFF
. В этом ответе я собираюсь объяснить, как это происходит.
int i = 234;
byte b = (byte) i;
System.out.println(b); // -22
int i2 = b & 0xFF;
// This is like casting b to int and perform and operation with 0xFF
System.out.println(i2); // 234
Если ваша машина 32-разрядная, то для типа данных int
необходимы 32-разрядные значения. byte
требуется только 8 бит.
Переменная int
i
представлена в памяти следующим образом (как 32-разрядное целое число).
0{24}11101010
Тогда переменная byte
b
представляется как:
11101010
Поскольку byte
s без знака, это значение представляет -22
. (Поиск дополнения 2, чтобы узнать больше о том, как представлять отрицательные целые числа в памяти)
Тогда, если вы разыгрываете на int
, оно все равно будет -22
, потому что приведение сохраняет знак числа.
1{24}11101010
Приведенное 32-bit
значение b
выполняет and
операцию с 0xFF
.
1{24}11101010 & 0{24}11111111
=0{24}11101010
Тогда вы получите 234
в качестве ответа.