byte轉換成int型別為啥要與(&)0xff?
舉個簡單的例子:
byte[] b = new byte[5];
b[0] = -12;
byte 8位二進位制 = 1個位元組 char 2個位元組 short (2個位元組) int(4個位元組) long(8個位元組) float (4個位元組) double(8個位元組)
計算機儲存資料機制:正數儲存的二進位制原碼,負數儲存的是二進位制的補碼。 補碼是負數的絕對值反碼加1。
比如-12,-12 的絕對值原碼是:0000 1100 取反: 1111 0011 加1: 1111 0100
byte --> int 就是由8位變 32 位 高24位全部補1: 1111 1111 1111 1111 1111 1111 1111 0100 ;
0xFF 是計算機十六進位制的表示: 0x就是代表十六進位制,A B C D E F 分別代表10 11 12 13 14 15 F就是15 一個F 代表4位二進位制:可以看做 是 8 4 2 1。
0xFF的二進位制表示就是:1111 1111。 高24位補0:0000 0000 0000 0000 0000 0000 1111 1111;
-12的補碼與0xFF 進行與(&)操作 最後就是0000 0000 0000 0000 0000 0000 1111 0100
轉換為十進位制就是 244。
byte型別的數字要&0xff再賦值給int型別,其本質原因就是想保持二進位制補碼的一致性。
當byte要轉化為int的時候,高的24位必然會補1,這樣,其二進位制補碼其實已經不一致了,&0xff可以將高的24位置為0,低8位保持原樣。這樣做的目的就是為了保證二進位制資料的一致性。
有人問為什麼上面的式子中b[0]不是8位而是32位,因為當系統檢測到byte可能會轉化成int或者說byte與int型別進行運算的時候,就會將byte的記憶體空間高位補1(也就是按符號位補位)擴充到32位,再參與運算。