byte
в Java - это число от −128 до 127 (со знаком, как и любое целое число в Java (за исключением char
, если вы хотите его посчитать)).С помощью 0xff
вы заставляете его быть положительным int
между 0 и 255.
Это работает, потому что Java выполнит расширяющее преобразование в int
, используя расширение знака, поэтому вместоотрицательный byte
у вас будет отрицательный int
.Маскирование с помощью 0xff
оставит только младшие 8 битов, что делает число снова положительным (и то, что вы изначально предполагали).
Вы, вероятно, не заметили разницу, потому что вы тестировали с byte[]
столько значения меньше 128.
Маленький пример:
public class A {
public static void main(String[] args) {
int[] ip = new int[] {192, 168, 101, 23};
byte[] ipb = new byte[4];
for (int i =0; i < 4; i++) {
ipb[i] = (byte)ip[i];
}
for (int i =0; i < 4; i++) {
System.out.println("Byte: " + ipb[i] + ", And: " + (0xff & ipb[i]));
}
}
}
Это печатает
Byte: -64, And: 192
Byte: -88, And: 168
Byte: 101, And: 101
Byte: 23, And: 23
, показывая разницу между тем, что в byte
, и тем, что вошло вбайт, когда он все еще был int
и каков результат операции &
.