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

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

4

3 回答 3

34

来自 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
于 2012-10-27T12:06:58.177 回答
9
byte z = x + y;  // x and y are declared final

在这里,因为xy被声明final,所以表达式的值RHS在编译时是已知的,它是固定的(1 + 2 = 3),不能改变。所以,你不需要明确地进行类型转换

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

然而,在这种情况下,ab的价值并未被宣布为最终的。因此,表达式的值在编译时是未知的,而是在运行时进行评估。因此,您需要进行显式转换。


但是,即使在第 1 段代码中,如果 的值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`
于 2012-10-27T12:05:32.387 回答
2

每当我们在两个变量 a 和 b 之间执行任何算术运算时,结果总是,

max(int, type of a, type of b)

byte a=10;
byte b=20;
byte c=a+b(C.E )

解释:如上所述 max(int, type of a, type of b)

最大(整数,字节,字节)

结果是类型: int ,找到的是 int 但需要以字节为单位

所以我们需要要求类型转换为字节

    byte a=10;
    byte b=20;
    byte c=(byte) (a+b);
于 2020-08-19T18:54:47.267 回答