java 类型转换 安全_JAVA 类型转换指令
類型轉換指令可以將兩種不同的數值類型進行相互轉換,這些轉換操作一般用于實現用戶代碼中的顯式類型轉換操作,或者用來處理本節開篇所提到的字節碼指令集中數據類型相關指令無法與數據類型一一對應的問題。
Java虛擬機直接支持(即轉換時無需顯式的轉換指令)以下數值類型的寬化類型轉換
(Widening Numeric Conversions,即小范圍類型向大范圍類型的安全轉換):
int類型到long、float或者double類型。
long類型到float、double類型。
float類型到double類型。
相對的,處理窄化類型轉換(Narrowing Numeric Conversions)時,必須顯式地使用轉換指令來完成,這些轉換指令包括:i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l和d2f。窄化類型轉換可能會導致轉換結果產生不同的正負號、不同的數量級的情況,轉換過程很可能會導致數值的精度丟失。
在將int或long類型窄化轉換為整數類型T的時候,轉換過程僅僅是簡單地丟棄除最低位N 個字節以外的內容,N是類型T的數據類型長度,這將可能導致轉換結果與輸入值有不同的正負號。這點很容易理解,因為原來符號位處于數值的最高位,高位被丟棄之后,轉換結果的符號就取決于低N個字節的首位了。
在將一個浮點值窄化轉換為整數類型T(T限于int或long類型之一)的時候,將遵循以下轉換規則:
如果浮點值是NaN,那轉換結果就是int或long類型的0。
如果浮點值不是無窮大的話,浮點值使用IEEE 754的向零舍入模式取整,獲得整數值v,如果v在目標類型T(int或long)的表示范圍之內,那轉換結果就是v。
否則,將根據v的符號,轉換為T所能表示的最大或者最小正數。
從double類型到float類型的窄化轉換過程與IEEE 754中定義的一致,通過IEEE 754向最接近數舍入模式舍入得到一個可以使用float類型表示的數字。如果轉換結果的絕對值太小而無法使用float來表示的話,將返回float類型的正負零。如果轉換結果的絕對值太大而無法使用
float來表示的話,將返回float類型的正負無窮大,對于double類型的NaN值將按規定轉換為float類型的NaN值。
盡管數據類型窄化轉換可能會發生上限溢出、下限溢出和精度丟失等情況,但是Java虛擬機規范中明確規定數值類型的窄化轉換指令永遠不可能導致虛擬機拋出運行時異常。
總結
以上是生活随笔為你收集整理的java 类型转换 安全_JAVA 类型转换指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Json串和java对象进行转时
- 下一篇: BZOJ 3391: [Usaco200