簡體   English   中英

顯式類型轉換浮點到字節

[英]explicit typecast float to byte

從浮點到字節的顯式類型轉換在 Java 中如何工作,為什么最后一個輸出也是 -1 而不是 0? 57 的第一個輸出可能是由於算術溢出,所以加 1 產生 58,這對我來說很有意義。 但因此我預計最后的輸出為 0。

public class Typecasts {

    public static void main(String[] args) {

        float f = 12345.0f;
        byte b = (byte) f;
        System.out.println(b); // output: 57
        b = (byte) (f + 1);
        System.out.println(b); // output: 58
        f = 12345678987654321.0f;
        b = (byte) f;
        System.out.println(b); // output: -1
        b = (byte) (f + 1);
        System.out.println(b); // output: -1
    }

}

根據 Java 語言規范 § 5.1,從floatbyte的轉換是一種縮小原語轉換,這可能會導致丟棄最重要的字節。

然而,真正的問題在於:像12345678987654321.0這樣的大數字已經失去了精度,甚至在執行類型轉換之前。 打印出f的值已經暗示了這一點:

1.23456795E16

請參閱 Java 語言規范 § 4.2.3 和§ 4.2.4

根據 IEEE 754 標准的規則執行浮點運算,包括上溢和下溢。

此外, JLS § 15.4定義了應如何執行浮點表達式。 讀起來有點技術性,但簡而言之,它會因為下溢而丟棄最低有效位。

所以在你的情況下, f + 1只會導致f

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM