byte轉int時為什麼要與上0xFF
阿新 • • 發佈:2018-11-23
首先要給出結論:
為了保證二進位制資料的一致性
首先需要回顧一下關於計算機中儲存數字的知識點
- 計算機是用補碼來儲存數字的
- 正數的反碼和補碼等於本身
- 負數的反碼符號位不變其它位取反
- 負數的補碼等於反碼+1
- 一個數補碼的補碼等於原碼
還需要知道的知識點是,java種的位元組,包括short,boolean都是以int為單位儲存的,所以會自動轉換
我們知道java的型別是固定長度的,byte是8位,int是32位,當byte轉int時jvm會自動填充,填充方式有兩種
- 無符號數字填充0
- 有符號數字填充符號位
我們要轉int屬於第二種方式
舉個例子
byte a = -127
a的原碼是1111 1111
a的補碼是1000 0001
a轉化為int時 jvm自動填充符號位變為1111 1111 1111 1111 1111 1111 1000 0001
為了計算它的值轉化為原碼1000 0000 0000 0000 0000 0111 1111
結果是-127
但是a補碼與上0xFF呢
1111 1111 1111 1111 1111 1111 1000 0001 & 1111 1111 =0000 0000 0000 0000 0000 0000 1000 0001
相當於a轉化為int時 jvm是按照第一種方式填充的0
此時計算它的值為129
那麼這兩種方法的區別在那裡呢?
很明顯第一種方式,轉化後的int的值發生了變化,但是2進位制串保持一致,第二種剛好相反,為了保持轉化後的int值不變,2進位制串發生了變化,所以我們要根據不同的應用場景取做選擇,主要是需求,比如我們做的是檔案的轉換,根本不需要考慮轉換後的int值有沒有發生變化。