byte爲什麼要與上0xff?進行與int運算

參考地址:點擊打開鏈接

舉個簡單的例子:

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位,再參與運算。

謝謝這個大哥的博客,看了他的博客才明白。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章