繁体   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