12 型別轉換指令

2021-10-13 09:35:00 字數 2702 閱讀 9427

作用:用於將兩種不同的資料型別進行相互轉換。其實也就是用於基本資料型別(出去bool型別)之間的相互轉換。

型別轉換指令分為寬化型別轉換和窄化型別轉換。

從小範圍型別轉換到大範圍型別的安全轉換稱為寬化型別轉換。例如從int轉換成long

指令包括:如圖中所示,圖中每一條紅色的線,就對應著一條指令。例如從intlong,就對應著i2l這條指令,其餘類推。

寬化型別轉換存在精度損失,例如從intfloat,或者從longdouble,可能會丟失掉幾個最低有效位的值。即使存在損失,jvm也不會丟擲異常。

例子:下圖中的**對應的寬化型別轉換指令,如下圖所示。

byteshortchar被當做是int進行處理,例如bytelong,使用的是i2l指令(而沒有b2l這樣乙個指令)。這樣一來,可以節省指令資源,因為指令總數不能超過256個;同時,區域性變數表中的槽位固定為32位(4個位元組),bytecharshort在存入區域性變數表中的時候,都會占用乙個槽位(32位),也就是乙個int資料型別所佔的位數,從這個角度說,直接把它們當成int進行處理,沒必要特意區分這三種資料型別。

例子:如下圖所示,bytelong,使用的是i2lbytedouble,使用的是i2d。而byteint,沒有指令。

從大範圍的資料型別到小範圍的資料型別的轉換稱為窄化型別轉換。

對應的指令包括:如圖中黃色部分所示。需要注意的是,存在intbyteshortchar的轉換指令,但是不存在longdoublefloat直接到byteshortchar的指令。

窄化型別轉換也存在精度損失的問題。即使存在損失,jvm也不會丟擲異常。

例子:可以看到,longdoublefloat直接到byteshortchar的指令,是通過兩條指令達到的,先轉到int,然後再從int轉成byteshortchar。例如floatbyte,使用的是f2ii2b這兩條指令。

對於nan、無窮大的窄化型別轉換:

例子:乙個浮點數轉換為整數:

1)如果浮點數是nan,轉換為整數0

2)如果浮點數是正無窮大/負無窮大,轉換為整數,則轉換為整數的能夠表示的最大值/最小值。

乙個double轉換為float型別:

1)如果doublenan,轉換為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進行轉換,但是如果有過載函式或者模板特化的話,...