为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我不能添加两个字节并得到一个整数,而我可以添加两个最终字节并得到一个字节?

为什么我不能添加两个字节并得到一个整数,而我可以添加两个最终字节并得到一个字节?

富国沪深 2019-10-21 10:12:18
public class Java{    public static void main(String[] args){        final byte x = 1;        final byte y = 2;        byte z = x + y;//ok        System.out.println(z);        byte a = 1;        byte b = 2;        byte c = a + b; //Compiler error        System.out.println(c);    }}如果包含int大小或更小的任何东西的表达式的结果始终是int,即使两个字节的总和适合一个字节。当我们添加一个字节中的两个最终字节时,为什么会发生这种情况? 没有编译器错误。
查看完整描述

2 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

从JLS 5.2分配转换


另外,如果该表达式是类型为byte,short,char或int的常量表达式(第15.28节):-如果变量的类型为byte,short或char,且值是常数表达式的可以表示为变量的类型。


简而言之,表达式的值(在编译时就知道了,因为它是一个常量表达式)可以用字节类型的变量表示。


考虑你的表情


 final byte x = 1;

 final byte y = 2;

 byte z = x + y;//This is constant expression and value is known at compile time

因此,由于求和适合字节,因此不会引发编译错误。


现在,如果你这样做


final byte x = 100;

final byte y = 100;

byte z = x + y;// Compilation error it no longer fits in byte


查看完整回答
反对 回复 2019-10-21
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

byte z = x + y;  // x and y are declared final

在这里,由于x和y被声明,final所以RHS在编译时就知道的表达式的值,该值固定为(1 + 2 = 3)并且不能改变。因此,您无需明确地进行类型转换


byte c = a + b;   // a and b are not declared final

但是,在这种情况下,a和的值b未声明为最终值。因此,表达式的值在编译时未知,而是在运行时求值。因此,您需要进行显式转换。


但是,即使在第一个代码中,如果的值a + b超出范围-128 to 127,它也将无法编译。


final byte b = 121;

final byte a = 120;

byte x = a + b;  // This won't compile, as `241` is outside the range of `byte`


final byte b1 = 12;

final byte a1 = 12;

byte x1 = a1 + b1;  // Will Compile. byte can accommodate `24`


查看完整回答
反对 回复 2019-10-21
  • 2 回答
  • 0 关注
  • 360 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信