我觉得2楼的答案更标准一点,我的想法和他一样。在他的答案的基础上我再修改一小部分。
b=b1+b2; 错误
意思是 b1和b2先自动提升为int类型, 并运算. 将运算后的结果赋值给byte类型的b , 损失精度.
为什么运算前要先自动提升为int? 因为这是JAVA设定的机制.
这些类型由低级到高级分别为(byte,short,char)--int--long--float--double
byte,short,char 类型运算时候都会自动提升到int类型,所以b1, b2 相加完成以后是int类型。
其实内部的程序过程是这样 byte b = (int)b1 +(int) b2 ; 就是说 ,b1 和b2 都已经被默认提升到int类型了,计算结果是int 类型,而b 还是byte , byte 是一个字节,而int 是4个字节,int数据范围远大于byte ,自然很可能超出精度,系统就会报错。
向上转型(由低级到高级就叫向上转型)是自动的,比如你用long 类型的 long lg = b1+ b2; 结果会自动提升到long 类型。 但是由上向下自动转是不可以的。
byte b =(byte) (b1 + b2); 这个是向下转型。 意思是b1 b2 默认转换成int 类型计算完成以后向下转型成byte 类型,然后再赋值给 byte类型的b 。这样没有任何问题。
而 b = 3+4 是正确的, 因为他是常量相加, 结果7在缓冲池中存在(-128~127), 所以可直接复制给byte类型的b。
常量相加,是先加,然后看结果在不在范围内,如果在就不会报错,超出范围就报错。 byte 范围是 (-128~127)。 7当然在,所以不会报错。
|