java中整型數據轉換深入解析

java中整型數據轉換深入解析

下面我會用幾個例子講解轉換的原理

int型強轉short

這種強轉是不推薦的,會導致高位數據丟失,浮點型會導致精度丟失。但是既然有這種方法,說明它是有存在的必要的。

首先看下面的情況:

test_level_1

先手算一下結果看看。

/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
正確結果是-1

test_level_1_result

/
下面解釋原理
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型

看下面的情況:

test_level_2

手算下結果看看

/
/
/
/
/
/
/
/
/
/
/
/
/
輸出結果是-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型

看下面的情況

test_level_3

節省一下篇幅,這裏就不用代碼塊隔開結果了

/
結果是65535

test_level_3_result

分析一下原理

/
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

以上就是本文全部內容

七夕快樂

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章