java中整型數據轉換深入解析
下面我會用幾個例子講解轉換的原理
int型強轉short
這種強轉是不推薦的,會導致高位數據丟失,浮點型會導致精度丟失。但是既然有這種方法,說明它是有存在的必要的。
首先看下面的情況:
先手算一下結果看看。
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
正確結果是-1
/
下面解釋原理
0x7fffffff 的二進制形式爲
0111 1111 1111 1111 1111 1111 1111 1111
立即數是int型 int型四個字節 所以是32位
上面就是Integer.MAX_VALUE的值 是int型的最大值
java中的數值是有符號型的,沒有unsigned類型,所以上面的int最大值的最高位爲0 表示正數
short類型是短整型 只有2個字節
所以對0x0fffffff進行強轉後的b變量值爲 0xffff 截取低地址的2字節
二進制爲 1111 1111 1111 1111 最高位爲1 負數 這個是補碼形式
轉換成十進制就是-1
結論是:字節數多的數據類型(簡稱高級類型吧)強轉爲比它字節數少的數據類型(簡稱低級類型吧)時,截取是從低地址開始的
short型賦值給int型
看下面的情況:
手算下結果看看
/
/
/
/
/
/
/
/
/
/
/
/
/
輸出結果是-1
分析一下原理
/
上面已經解釋了b變量的值爲-1
現在把short類型變量b的值賦給int型變量 intc
把一個固體球放到一個空間大它一倍的容器中 會發生什麼呢 結果顯而易見 固體球沒變化 容器中多了一個固體球
那麼把一個short賦給int,intc的值和b的值在十進制下是完全一致的,都是-1
但是二進制下有區別 b的二進制是 1111 1111 1111 1111
intc的二進制是 1111 1111 1111 1111 1111 1111 1111 1111
運算符兩邊是int型和short型
看下面的情況
節省一下篇幅,這裏就不用代碼塊隔開結果了
/
結果是65535
分析一下原理
/
b & 0xffff 中的0xffff是立即數 立即數爲整型 實際應該爲0x0000 ffff 四字節
b自動升級爲int 具體值爲十進制-1 原理請看上面的例子 十六進制爲0xffff ffff
-------------------------具體運算-----------------------------
0000 0000 0000 0000 1111 1111 1111 1111
b 1111 1111 1111 1111 1111 1111 1111 1111
位與
結果 0000 0000 0000 0000 1111 1111 1111 1111
注意,這個時候符號位依然是最高位,符號位爲0 正數 上面的二進制就是原碼 轉成十進制就是
65535
以上就是本文全部內容
七夕快樂