作用:用於將兩種不同的資料型別進行相互轉換。其實也就是用於基本資料型別(出去bool
型別)之間的相互轉換。
型別轉換指令分為寬化型別轉換和窄化型別轉換。
從小範圍型別轉換到大範圍型別的安全轉換稱為寬化型別轉換。例如從int
轉換成long
。
指令包括:如圖中所示,圖中每一條紅色的線,就對應著一條指令。例如從int
到long
,就對應著i2l
這條指令,其餘類推。
寬化型別轉換存在精度損失,例如從int
到float
,或者從long
到double
,可能會丟失掉幾個最低有效位的值。即使存在損失,jvm
也不會丟擲異常。
例子:下圖中的**對應的寬化型別轉換指令,如下圖所示。
byte
、short
、char
被當做是int
進行處理,例如byte
到long
,使用的是i2l
指令(而沒有b2l
這樣乙個指令)。這樣一來,可以節省指令資源,因為指令總數不能超過256個;同時,區域性變數表中的槽位固定為32
位(4
個位元組),byte
、char
、short
在存入區域性變數表中的時候,都會占用乙個槽位(32
位),也就是乙個int
資料型別所佔的位數,從這個角度說,直接把它們當成int
進行處理,沒必要特意區分這三種資料型別。
例子:如下圖所示,byte
到long
,使用的是i2l
,byte
到double
,使用的是i2d
。而byte
到int
,沒有指令。
從大範圍的資料型別到小範圍的資料型別的轉換稱為窄化型別轉換。
對應的指令包括:如圖中黃色部分所示。需要注意的是,存在int
到byte
、short
、char
的轉換指令,但是不存在long
、double
、float
直接到byte
、short
、char
的指令。
窄化型別轉換也存在精度損失的問題。即使存在損失,jvm
也不會丟擲異常。
例子:可以看到,long
、double
、float
直接到byte
、short
、char
的指令,是通過兩條指令達到的,先轉到int
,然後再從int
轉成byte
、short
、char
。例如float
到byte
,使用的是f2i
,i2b
這兩條指令。
對於nan
、無窮大的窄化型別轉換:
例子:乙個浮點數轉換為整數:
1)如果浮點數是nan
,轉換為整數0
2)如果浮點數是正無窮大/
負無窮大,轉換為整數,則轉換為整數的能夠表示的最大值/
最小值。
乙個double
轉換為float
型別:
1)如果double
是nan
,轉換為float
也是nan
2)如果double
是正負無窮大,轉換為float
也是正負無窮大
3)如果double
太小,無法用float
表示,則轉換為正負0
C 基礎(12)型別轉換
我於昨晚去世,走時心如止水。我於今早重生,來時心懷暖陽。型別轉換 cast 是將一種資料型別轉換成另一種資料型別。例如,如果將乙個整型值賦給乙個浮點型別的變數,編譯器會暗地裡將其轉換成浮點型別。轉換是非常有用的,但是它也會帶來一些問題,比如在轉換指標時,我們很可能將其轉換成乙個比它更大的型別,但這可...
21型別轉換
典型案例總結 靜態型別轉換,編譯的時c 編譯器會做型別檢查 基本型別能轉換 但是不能轉換指標型別,只要隱式型別轉換可以的地方都可以使用static cast。若不同型別之間,進行強制型別轉換,用reinterpret cast 進行重新解釋。一般性結論 總結 static cast 和reinter...
七型別轉換
c 提供六種型別轉換符號。前兩種是c風格,稱為c風格強制轉換,t 或者t 他們的效果一樣。後面四種分別是 負責將const型別轉換為非const型別,也可以反過來轉換。通常非const型別會自動轉換成const型別,所以一般不需要使用const cast進行轉換,但是如果有過載函式或者模板特化的話,...