【问题标题】:Why is not the sum of bytes a byte type itself? [duplicate]为什么字节总和本身不是字节类型? [复制]
【发布时间】:2020-02-25 19:27:03
【问题描述】:
class Example{
     public static void main(String args[]){
           byte b1=10,b2=20,b3; //line 1
           b3=b1+b2;            //line 2
        }
}

为什么第 2 行出现编译错误?

Example.java:4: error: incompatible types: possible lossy conversion from int to byte

【问题讨论】:

  • 不,它不是字节:如果两个操作数都不是doublefloatlong,则操作数将转换为int

标签: java variables types type-conversion


【解决方案1】:

您应该显式转换为字节,因为编译器推断将两个字节的总和作为一个 int。

将第 2 行替换为:

b3 = (byte)(b1+b2);

干杯。

【讨论】:

    【解决方案2】:

    你的代码是

    class Example{
         public static void main(String args[]){
               byte b1=10,b2=20,b3; //line 1
               b3=b1+b2;            //line 2
            }
    } 
    

    第 2 行出错的原因,因为 JLS 5.6.2 说清楚了。

    当一个运算符将二进制数字提升应用于一对 操作数,每个操作数必须表示一个可转换为 数字类型,按顺序应用以下规则,使用扩展 转换(§5.1.2)根据需要转换操作数:如果任何 操作数是引用类型,拆箱转换(§5.1.8)是 执行。那么:如果任一操作数是双精度类型,则另一个是 转换为双倍。否则,如果任一操作数是浮点类型, 另一个转换为浮点数。否则,如果任一操作数是 类型long,其他转换为long。否则,两个操作数 转换为 int 类型。

    这意味着 Java 更喜欢将较小的数据类型视为整数,因为任何现代处理器都至少有 32 位字。一个字节 + 一个字节被转换为一个 int + 和 int,结果是一个 int。在这里添加位很容易 - 新位都是 0。

    所以你可以通过两种方式解决这个问题 -

    1. 显式类型转换

    class Example{
         public static void main(String args[]){
               byte b1=10,b2=20,b3; //line 1
               b3= (byte)b1+b2;            //line 2
            }
    } 
    
    1. 通过声明 final
    class Example{
         public static void main(String args[]){
               final byte x = 1;
               final byte y = 2;
               byte z = x + y;
            }
    } 
    

    【讨论】:

      猜你喜欢
      • 2014-03-20
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2021-12-10
      • 2019-06-25
      相关资源
      最近更新 更多