在Java中byte類型是有符號的,而Java中又沒有提供無符號的byte類型,因此在其表示範圍為-128-127之間。而這樣對於一些I/O處理常式來說需要對考慮符號位問題,通常的做法可能是:
int unsignedByte = signedByte >=0 ? signedByte : signedByte + 256;
這裡我們發現,由於byte的符號位的關係,我們不得不採用長度更長的int類型來處理符號位帶來的問題。因此,我們會覺得byte由於要考慮符號位其範圍變小了,所以,我們只好通過int來處理。在這個類型的轉換過程中,任意長度的int類型會截斷其高位的位元組來適應byte類型,因為int類型要比byte類型寬。這也就是為什麼一個int的127轉換成了byte還是一個127。
不過,我們考慮另外一種情況,就是當一個int值大過byte表示的數值範圍的時候,這個時候問題就出現了。比如,int的128轉換成一個byte類型會是-128。這是因為補碼運算的關係造成的。首先,128寫成16進位是0x00000080,當做int到byte的類型轉換的時候,前面的0被截斷形成0x80。在二進位中0x80可以寫成10000000,如果這是一個無符號數哪麼一切正常,但是如果是一個有符號數就會經過補碼運算。對於負數而言,其補碼運算就是反碼(就是1轉換成0並且反正既然)加一。哪麼,10000000的補碼就是01111111加一,即10000000=128(十進位)。因此,byte0x80事實上表示的也
就是-128了。類似的int類型的129就是byte類型的-127,而int類型的130則是byte類型的-126,等等,直到int的255對應為byte的-1。
哪麼如果到了256呢?此時,地位的位元組被0來填充,簡而言之256就是0x00000100。因此,轉換成byte就是0,這個轉換迴圈也就是256個。因此,我們根據上述原理,得出如下規律:
byte byteValue=0;
int temp = intValue % 256;
if ( intValue < 0) {
byteValue = (byte)(temp < -128 ? 256 + temp : temp);
}
else {
byteValue = (byte)(temp > 127 ? temp - 256 : temp);
}
上述過程中,我們既可以把有符號的byte轉換成無符號的byte(用int類型儲存),也可以把有符號但可能超出byte範圍的資料轉換成有符號的byte。