Java中byte的符號位

來源:互聯網
上載者:User

     在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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.