我们来看一下代码---->
byte a=1;
byte b=2;
byte c=a+b;//编译不通过
byte d=1+2;//编译通过
首先我们来看 byte c=a+b;报错的原因
提示的是需要byte类型却找到的是int类型,明明是两个byte类型呀,为什么说找到的是int类型呢?说明虚拟机“认为”a+b是int类型
那么问题就来了,byte d=1+2;这里=右边的1+2不也是int类型吗为什么它却不报错呢?
我刚开始也一直想不通,后来发现这里byte d=1+2;不就相当于byte d=3;吗,这和第一、二行的代码有区别吗?我们知道在给byte类型的变量赋值的时候,虚拟机会自动地识别右边int类型常量是否在byte类型地取值范围类 [-128,128),如果不在则会报错,说到这里是不是已经恍然大悟了,如果还不理解可以看一下这种情况:
所以说byte d=1+2;能编译通过,是因为虚拟机提前把1+2的结果计算出来之后,并判断结果在取值范围之内,故编译通过;而byte c=a+b;之所以不能通过编译,是因为虚拟机无法判断a+b的结果是否在取值范围内,也就是不知道会不会出现像上图的情况。总而言之就是两个byte变量相加有可能超过byte的取值范围,所以会报错。
至此就是我对这个问题的理解,如有不对的地方欢迎dalao们指教。^-^