byte
trong Java là một số giữa − 128 và 127 (chưa ký, giống như mọi số nguyên trong Java (ngoại trừ char
nếu bạn muốn đếm)). Bởi anding với 0xff
bạn đang buộc nó phải là một tích cực int
từ 0 đến 255.
Nó hoạt động vì Java sẽ thực hiện một chuyển đổi mở rộng để int
, sử dụng phần mở rộng dấu, vì vậy thay vì phủ định byte
bạn sẽ có một tiêu cực int
. Masking với 0xff
sẽ chỉ để lại 8 bit thấp hơn, do đó làm cho số dương một lần nữa (và những gì bạn ban đầu dự định).
Có thể bạn không để ý sự khác biệt bởi vì bạn thử nghiệm với một byte[]
chỉ với giá trị nhỏ hơn 128.
ví dụ nhỏ:
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]));
}
}
}
này in
Byte: -64, And: 192
Byte: -88, And: 168
Byte: 101, And: 101
Byte: 23, And: 23
hiển thị sự khác biệt giữa những gì trong số byte
, những gì đã đi vào byte khi nó vẫn là một int
và thứ gì kết quả của hoạt động &
là.
Tôi không chắc chắn, nhưng có vẻ như chuyển đổi thành byte chưa ký. – Osw