關於java中強制轉換


在百度上遇到一個問題,描述如下:

在java中,定義兩個變量

byte x = (byte) 128;
byte y = (byte)-129;

輸出后,為什么結果是-128和128?

借此機會,自己也認真的思考了一下這個問題,並得出了正確的結果,下面就談談我的理解。

這種問題在剛開始學習java的時候確實令我很費解來的,因為如果只是局限在java語言本身中,這個問題是沒法得到真正的解的,頂多也是知其然不知其所以然。一年多來對計算機系統的更深入的學習,我現可以嘗試着去解答這個問題了。

首先你要知道,在計算機中數是以二進制形式存在的,而且可以有三種表示方式,原碼,反碼,補碼。

首先討論第一個數128。java中默認整數是int類型(4字節長)的,並且在機器中用補碼表示,所以它在計算機內部存儲的二進制串為:

00000000 00000000 00000000 10000000 

這是128的二進制補碼形式,一共是四字節,32位,其中最高位0為符號位,代表正數。

這時候對128進行強制類型轉換,因為byte只有1字節,即8位,所以這個二進制串就要被截短,截取的規則是:只保留低8位:

10000000

被截取掉的只是1前面的24個0,看起來好像並沒有影響數據大小,但這個時候的二進制串還表示128嗎?

不是了,因為byte的最高位也是符號位!也就是說現在1被用來作符號位了,即代表是負數, 后面的7個0000000才用來表示數值,結合起來1 0000000 代表的就是-128。

所以這就是為什么128強制轉換類型后會變成-128的原因,知道了這點,其他情況的類型轉換也是可以類似分析的。

比如看下-129的情況

-129依然是存儲為四字節,它的原碼為:10000000 00000000 00000000 10000001

不過計算機中存儲的是補碼形式,所以它存儲的二進制串為:11111111 11111111 11111111 01111111

還是一樣的,強制轉換,只保留低低八位:01111111

最高位同樣為符號位,即0,表示為正數,1111111表示數值,為128

所以結果就是128.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM