1. 程式人生 > >byte轉int時為什麼要與上0xFF

byte轉int時為什麼要與上0xFF

 首先要給出結論:

 為了保證二進位制資料的一致性

首先需要回顧一下關於計算機中儲存數字的知識點

  • 計算機是用補碼來儲存數字的
  • 正數的反碼和補碼等於本身
  • 負數的反碼符號位不變其它位取反
  • 負數的補碼等於反碼+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值有沒有發生變化。