猿问

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

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,即使两个字节的总和适合一个字节。


当我们添加一个字节中的两个最终字节时,为什么会发生这种情况? 没有编译器错误。


富国沪深
浏览 361回答 2
2回答

牧羊人nacy

从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

鸿蒙传说

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`
随时随地看视频慕课网APP

相关分类

Java
我要回答