[英]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,從float
到byte
的轉換是一種縮小原語轉換,這可能會導致丟棄最重要的字節。
然而,真正的問題在於:像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.