byte:byte在java中占据一个字节即用8位bit表示,因为是有符号数,所以它的表示范围是-128-127.如果在运算过程中超出了范围限制就出现溢出。
char:char在java中占据两个字节,即用16位表示一个char类型的数据。由于char是无符号的所以其表示范围是0-65536.当计算超过其表示范围时,系统会自动将结果转换为int类型。
short:short在java中占据两个字节也是由16位表示,因为short是有符号数据故其表示范围是-32768-32767
引用一段话 对于short,byte,char 比int 字节数小的变量类型来说,运算结果会自动转换为int类型。Java编译器会在编译期或者运行期将byte和short类型的数据带符号扩展为相应的int类型数据,将boolean和char类型数据零位扩展为相应的int类型数据。因此,在处理boolean 、byte、short 和 char 类型的数组是,也会用相应的int类型的字节码指令来处理。因此,大多数对于上述类型数据的操作,实际上都是使用相应的 int 类型作为运算类型。如下:
short a=1, b=2;
short c=a+b;
System.out.println©;
在编译时,会报出“Exception in thread “main” java.lang.Error: Unresolved compilation problem:Type mismatch: cannot convert from int to short”,可以看出可以看出a+b结果变成了int类型。
重点来了,如果是final 修饰的变量,进行运算的时候则不会出现类型转换异常。
final short a=1, b=2;
short c=a+b;
System.out.println©;
这么操作完全OK,究其原因,对于final 修饰的基本类型的变量来说,他们之间的运算直接就被硬编码成了直接赋值语句,连中间结果都没有了,类型转换的异常也就没了。