參考地址:點擊打開鏈接
舉個簡單的例子:
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位,再參與運算。
謝謝這個大哥的博客,看了他的博客才明白。