Mặc dù đã quá muộn, tôi muốn đưa ra ý kiến đóng góp của mình về vấn đề này vì nó có thể làm rõ lý do tại sao giải pháp do JB Nizet đưa ra lại hoạt động. Tôi tình cờ gặp vấn đề nhỏ này khi làm việc trên trình phân tích cú pháp byte và tự chuyển đổi chuỗi. Khi bạn sao chép từ kiểu tích phân có kích thước lớn hơn sang kiểu tích phân có kích thước nhỏ hơn như tài liệu java này cho biết điều này sẽ xảy ra:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3
Chuyển đổi thu hẹp một số nguyên có dấu thành một loại tích phân T chỉ đơn giản là loại bỏ tất cả trừ n thấp nhất bit thứ tự, trong đó n là số bit được sử dụng để biểu diễn kiểu T. Ngoài việc có thể mất thông tin về độ lớn của giá trị số, điều này có thể khiến dấu của giá trị kết quả khác với dấu của giá trị đầu vào .
Bạn có thể chắc chắn rằng byte là kiểu tích phân như tài liệu java này cho biết
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
byte: Kiểu dữ liệu byte là 8-bit có ký hai. số nguyên bổ sung.
Vì vậy, trong trường hợp truyền một số nguyên (32 bit) thành một byte (8 bit), bạn chỉ cần sao chép cuối cùng (8 bit quan trọng nhất) của số nguyên đó vào biến byte đã cho.
int a = 128;
byte b = (byte)a; // Last 8 bits gets copied
System.out.println(b); // -128
Phần thứ hai của câu chuyện liên quan đến cách các toán tử đơn phân và nhị phân trong Java thúc đẩy các toán hạng.
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2
Mở rộng chuyển đổi nguyên thủy (§5.1.2) được áp dụng để chuyển đổi một hoặc cả hai toán hạng như đã chỉ định theo các quy tắc sau:
Nếu một trong hai toán hạng thuộc loại double, toán hạng kia được chuyển thành double.
Ngược lại, nếu một trong hai toán hạng là kiểu float, thì toán hạng kia sẽ được chuyển thành float.
Ngược lại, nếu một trong hai toán hạng có kiểu là long, thì toán hạng còn lại sẽ được chuyển thành dài.
Nếu không, cả hai toán hạng đều được chuyển đổi thành kiểu int.
Hãy yên tâm, nếu bạn đang làm việc với kiểu tích phân int và / hoặc thấp hơn, nó sẽ được thăng cấp thành int.
// byte b(0x80) gets promoted to int (0xFF80) by the & operator and then
// 0xFF80 & 0xFF (0xFF translates to 0x00FF) bitwise operation yields
// 0x0080
a = b & 0xFF;
System.out.println(a); // 128
Tôi cũng vò đầu bứt tai vì chuyện này :). Có một câu trả lời tốt cho điều này ở đây bởi rgettman.
Toán tử bitwise trong java chỉ dành cho số nguyên và dài?