1. 程式人生 > >(二十一)類型轉換指令

(二十一)類型轉換指令

顯式 範圍 RR oat 數據 運行時異常 輸入 支持 大數字

一、概念

  • 類型轉換指令可以將兩種 Java 虛擬機數值類型進行相互轉換,這些轉換操作一般用於實現用戶代碼的顯式類型轉換操作,或者用來處理 Java 虛擬機字節碼指令集中指令非完全獨立獨立的問題。
  • Java 虛擬機直接支持(譯者註:“直接支持”意味著轉換時無需顯式的轉換指令)以下數值的寬化類型轉換(Widening Numeric Conversions,小範圍類型向大範圍類型的安全轉換):
  1. int 類型到 long、float 或者 double 類型
  2. long 類型到 float、double 類型
  3. float 類型到 double 類型
  • 窄化類型轉換(Narrowing Numeric Conversions)指令包括有:i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l 和 d2f。窄化類型轉換可能會導致轉換結果產生不同的正負號、不同的數量級,轉換過程很可能會導致數值丟失精度。
  • 在將 int 或 long 類型窄化轉換為整數類型 T 的時候,轉換過程僅僅是簡單的丟棄除最低位N 個字節以外的內容,N 是類型 T 的數據類型長度,這將可能導致轉換結果與輸入值有不同的正負號(譯者註:在高位字節符號位被丟棄了)。
  • 在將一個浮點值轉窄化轉換為整數類型 T(T 限於 int 或 long 類型之一)的時候,將遵循以下轉換規則:
    ? 如果浮點值是 NaN,那轉換結果就是 int 或 long 類型的 0
    ? 否則,如果浮點值不是無窮大的話,浮點值使用 IEEE 754 的向零舍入模式(§2.8.1)
    取整,獲得整數值 v,這時候可能有兩種情況:
    ? 如果 T 是 long 類型,並且轉換結果在 long 類型的表示範圍之內,那就轉換為 long
    類型數值 v
      ? 如果 T 是 int 類型,並且轉換結果在 int 類型的表示範圍之內,那就轉換為 int
    類型數值 v
    ? 否則:
    ? 如果轉換結果 v 的值太小(包括足夠小的負數以及負無窮大的情況),無法使用 T 類
    型表示的話,那轉換結果取 int 或 long 類型所能表示的最小數字。
    ? 如果轉換結果 v 的值太大(包括足夠大的正數以及正無窮大的情況),無法使用 T 類
    型表示的話,那轉換結果取 int 或 long 類型所能表示的最大數字。
    從 double 類型到 float 類型做窄化轉換的過程與 IEEE 754 中定義的一致,通過 IEEE 754
    向最接近數舍入模式(§2.8.1)舍入得到一個可以使用 float 類型表示的數字。如果轉換結果
    的絕對值太小無法使用 float 來表示的話,將返回 float 類型的正負零。如果轉換結果的絕對值
    太大無法使用 float 來表示的話,將返回 float 類型的正負無窮大,對於 double 類型的 NaN
    值將就規定轉換為 float 類型的 NaN 值。
    盡管可能發生上限溢出、下限溢出和精度丟失等情況,但是 Java 虛擬機中數值類型的窄化轉
    換永遠不可能導致虛擬機拋出運行時異常(此處的異常是指《Java 虛擬機規範》中定義的異常,
    請讀者不要與 IEEE 754 中定義的浮點異常信號產生混淆)

(二十一)類型轉換指令