[英]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.