Java 为什么我不能加上两个字节得到一个int,我可以加上最后两个字节得到一个字节?

Java 为什么我不能加上两个字节得到一个int,我可以加上最后两个字节得到一个字节?,java,int,variable-assignment,scjp,ocpjp,Java,Int,Variable Assignment,Scjp,Ocpjp,如果表达式的结果包含任何整数大小或更小的内容,则即使两个字节的总和适合一个字节,结果也始终是整数 为什么我们在一个字节中添加最后两个字节时会发生这种情况? 没有编译器错误 public class Java{ public static void main(String[] args){ final byte x = 1; final byte y = 2; byte z = x + y;//ok System.out.pr

如果表达式的结果包含任何整数大小或更小的内容,则即使两个字节的总和适合一个字节,结果也始终是整数

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

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);
    }
}
这里,由于
x
y
被声明为
final
,因此
RHS
上的表达式值在编译时是已知的,它固定在
(1+2=3)
,并且不能改变。因此,您不需要显式地对其进行类型转换

byte z = x + y;  // x and y are declared final
然而,在这种情况下,
a
b
的值不是最终值。因此,表达式的值在编译时是未知的,而是在运行时计算的。因此,您需要执行显式强制转换


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

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

此外,如果表达式是byte、short、char或int类型的常量表达式(§15.28): -如果 变量是byte、short或char,以及常量的值 表达式可以用变量的类型表示

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

想想你的表情

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`
所以,由于求和适合于字节,所以不会引起编译错误

现在如果你这样做了

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

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

final byte x = 100;
final byte y = 100;
byte z = x + y;// Compilation error it no longer fits in byte
说明:如上所述 最大值(整数,a型,b型)

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

结果的类型为:int,find为int,但在字节中是必需的

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

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

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

如果x=120和y=120,会附加什么?@Aubin。在这种情况下,它将失败。因为240不能容纳在字节中。因此,总而言之,OP没有看到错误,因为他幸运地选择了可以容纳在字节中的值。@Aubin感谢添加了摘要和详细描述,但允许添加两个int类型。即使是int类型,溢出也可能发生,对吗?为什么int和byte类型的行为不同?还有,Where.@Rajesh,因为java中的二进制操作(+)将返回整数。您可能需要显式转换字节c=(字节)(a+b);或者将这些字节字段声明为final。但是,+=操作符为您执行强制转换。比方说,如果你有字节a=2,b=3;然后(a+=b)按预期给你5,既不需要显式转换也不需要“final”。你能解释一下为什么我们必须将a,b的和转换为字节c=(字节)(a+b),为什么会抛出错误<代码>字节c=(a+b)
    byte a=10;
    byte b=20;
    byte c=(byte) (a+b);