byte為什麼要與上0xff?

2021-08-20 12:41:20 字數 1778 閱讀 5837

無意間翻看之間的**,發現了一段難以理解的**。

byte bs =digest.digest(origin.getbytes(charset.forname(charsetname))) ;  

for (int i = 0; i < bs.length; i++)

} return sb.tostring() ;

bs是由一段字串經過md5加密後,輸出的byte陣列。我起初難以理解為什麼在接下來的迴圈中要將bs[i]&oxff再複製給int型別呢?

bs[i]是8位二進位制,0xff轉化成8位二進位制就是11111111,那麼bs[i]&0xff不是還是bs[i]本身嗎?有意思嗎?

後來我又寫了乙個demo

package

jvmproject;

public

class

test

}

我先列印a[0],在列印a[0]&0xff後的值,本來我想結果應該都是-127.

但是結果真的是出人意料啊!

-127

129到底是為什麼呢?&0xff反而不對了。

樓主真的是不懂啊,後來往補碼那個方向想了想。

記得在學計算機原理的時候,了解到計算機內的儲存都是利用二進位制的補碼進行儲存的。

複習一下,原碼反碼補碼這三個概念

對於正數(00000001)原碼來說,首位表示符號位,反碼 補碼都是本身

對於負數(100000001)原碼來說,反碼是對原碼除了符號位之外作取反運算即(111111110),補碼是對反碼作+1運算即(111111111)

概念就這麼簡單。

當將-127賦值給a[0]時候,a[0]作為乙個byte型別,其計算機儲存的補碼是10000001(8位)。

將a[0] 作為int型別向控制台輸出的時候,jvm作了乙個補位的處理,因為int型別是32位所以補位後的補碼就是1111111111111111111111111 10000001(32位),這個32位二進位制補碼表示的也是-127.

發現沒有,雖然byte->int計算機背後儲存的二進位制補碼由10000001(8位)轉化成了1111111111111111111111111 10000001(32位)很顯然這兩個補碼表示的十進位制數字依然是相同的。

但是我做byte->int的轉化 所有時候都只是為了保持 十進位制的一致性嗎?

不一定吧?好比我們拿到的檔案流轉成byte陣列,難道我們關心的是byte陣列的十進位制的值是多少嗎?我們關心的是其背後二進位制儲存的補碼吧

所以大家應該能猜到為什麼byte型別的數字要&0xff再賦值給int型別,其本質原因就是想保持二進位制補碼的一致性。

當byte要轉化為int的時候,高的24位必然會補1,這樣,其二進位制補碼其實已經不一致了,&0xff可以將高的24位置為0,低8位保持原樣。這樣做的目的就是為了保證二進位制資料的一致性。

當然拉,保證了二進位制資料性的同時,如果二進位制被當作byte和int來解讀,其10進製的值必然是不同的,因為符號位位置已經發生了變化。

象例2中,int c = a[0]&0xff;  a[0]&0xff=1111111111111111111111111 10000001&11111111=000000000000000000000000 10000001 ,這個值算一下就是129,

所以c的輸出的值就是129。有人問為什麼上面的式子中a[0]不是8位而是32位,因為當系統檢測到byte可能會轉化成int或者說byte與int型別進行運算的時候,就會將byte的記憶體空間高位補1(也就是按符號位補位)擴充到32位,再參與運算。上面的0xff其實是int型別的字面量值,所以可以說byte與int進行運算。

為什麼byte取值是 128到127

建議你baidu下 補碼 就會比較清楚了,第一位是符號位。00000000 0 11111111 1 10000000 128 01111111 127 負數的補碼 負數的補碼是對其原碼逐位取反,但符號位除外 然後整個數加1。同乙個數字在不同的補碼表示形式裡頭,是不同的。比方說 15的補碼,在8位2...

為什麼使用do while 0

最近學習cocos2d x,看到不少使用do while 0 的巨集定義,如 define cc safe delete p do while 0 這裡使用do while 0 來確保語句塊被執行一次,那麼,能不能使用別的語法結構,完成這樣的工作呢?1 直接使用 語句塊 define cc safe...

為什麼PR值顯示為0

先看下你 首頁 所對應的鏈結是ww w.c om或是w ww.co m index.html ww w.com ind ex.php或其他。如果你的網域名稱pr值大於0,而首頁在瀏覽器pr值外掛程式上顯示為0,則是因為你 首頁鏈結設定問題。現在基本上80 的 因為沒有這個意識,的 首頁 往往不是設定...