java变量中的自动类型转换

class Demo1
{
public static void main(String[] args)
{

        byte b = 17;
        byte x = 21;
        byte m =x  +b;
        System.out.println("x="+m);
}

}
图片说明
为什么会报错?
而:
class Demo2
{
public static void main(String[] args)
{

        int b = 17;
        int x = 21;
        int m =x  +b;
        System.out.println("x="+m); 
}

}
却没错.
为什么Demo1里面的x和b明明都是byte类型却会报错,Demo2里面的int类型之间进行运算却没错,求大神解答

下面是JVM指令集截图。
图片说明
如图片提示,加运算(add)只有 int long float double 这4个数字类型支持的。
所以比int少的加运算自动换成int的加运算,结果也是int

还有 自动类型转换是比自己大的类型才可以。转到比自己少的类型只能explicitly。 所以前者就报错了。

byte b=13;
byte x=13;
byte m=(byte)b+(byte)x;
这样就可以了,因为byte在运算时会自动转换成int

byte + byte 会自动转成int,jvm内部的一个操作

第一种,17,21会作为int型处理,所以后面x+b被认为是int行,大范围数据向小范围数据有可能丢失

加运算在java里只能对int double float String类型使用,如果用了就会把答案转成这些类型。char byte short boolean这些都不能用

这个就是java里的硬性要求,具体研究jvm的指令计算。