【问题标题】:type casting of byte and intbyte 和 int 的类型转换
【发布时间】:2012-02-21 15:13:47
【问题描述】:

我要一个代码 sn-p:

class AutoTypeCast{
    public static void main(String...args){
        int x=10;
        byte b=20;//no compilation error
        byte c=x;//compilation error
    }
}

为什么20 会自动类型转换为bytex 不会?

【问题讨论】:

标签: java


【解决方案1】:

因为xint 并且具有更广泛的范围为byte。这就是为什么可能存在数据丢失的原因,您将其分配给byte

20 是一个常数,而编译时间保证在byte 的范围内。

【讨论】:

    【解决方案2】:

    因为编译器无法在编译时计算出 X 的值。所以它假设 X 可以包含大于字节范围的值。如果你将变量 X 设为 final,那么它不会给你编译时错误。

            final int x=10;
            byte b=20;//no compilation error
            byte c=x;//no compilation error
    

    【讨论】:

      【解决方案3】:

      20 总是可以用一个字节表示,而 x,根据编译器可以是任何整数,可能太大而不能用一个字节表示。

      【讨论】:

        【解决方案4】:

        20-128..127 范围内,所以它的值适合byte

        【讨论】:

          【解决方案5】:

          在这种情况下,x 被初始化为 10,因此在从 32 位 int 到 8 位 byte 的转换过程中不会丢失数据。但一般来说,从int 转换为byte 时,可能会丢失数据,因此Java 语言的规则禁止将int 值分配给byte 而不进行强制转换。此规则旨在使编写错误代码变得更加困难。通过插入 (byte) 演员表,您实际上是在告诉编译器:“是的,我已经考虑过数据丢失的可能性,这不是问题(或者,这实际上是我想要的)。”

          【讨论】:

            【解决方案6】:

            当编译器查看该行时

            byte b=20;
            

            它知道它正在寻找 b= 之后的一个字节。当它找到一个常量数值时,它在编译时就知道它肯定会在 byte 的范围内,所以它会自动转换它。

            什么时候看线

            byte c=x;
            

            它再次在 c= 之后寻找一个字节,但不是找到一个数字常量,而是找到一个已经定义类型的变量,并且在编译时无法确定它将在 byte 的范围内,因此会出现错误。

            【讨论】:

              【解决方案7】:

              X 定义为整数,在缩小时可能会丢失数据,这就是编译器错误的原因。参考jvm spec for conversions & promotions

              【讨论】:

                【解决方案8】:

                向上转换是自动的,向下转换或缩小 (byte c=x;) 应该是明确的,因为它可能会导致程序员应该明确意识到的精度损失。要更正它,您需要明确转换 byte c=(byte)x;

                【讨论】:

                  猜你喜欢
                  • 2014-02-20
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-06-25
                  • 1970-01-01
                  • 2023-04-09
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-02-03
                  相关资源
                  最近更新 更多