一.
对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,
那么java编译器将会自动隐含的为我们补上一个(byte)(short)(char)
- 如果没有超过左侧的范围,编译器补上强转。
- 如果右侧超过的左侧范围,那么直接编译器报错。
public class Notice1{
public static void main(String [] args){
byte num1 = 127;
System.out.println(num1);
//127为默认的int类型,在代码中应该加(byte)来强转,
//但由于127没有超过byte的范围,所以编译器自动隐形的为我们补上了一个(byte)
}
}
二.编译器的常量优化
在给变量进行赋值的时候,如果右侧的表达式当中全部是常量,没有任何变量,
那么编译器javac会直接将若干个常量表达式计算得到的结果。
编译之后,得到的.class字节码文件中相当于【直接就是】:short reslut = 13;
右侧的常量结果数值,没有超过左侧范围,所以正确。
这被称为“编译器的常量优化”。
但是注意,一旦表达式当中有变量参与,那么就不能进行优化了。
public class Demo{
public static void main(String[] args){
short num1 = 10;//正确写法,右侧没有超过左侧的范围。
short a = 5;
short b = 8;
//short + short --> int + int --> int
//short result = a + b;//错误写法!左侧需要的是int类型
//右侧不用变量,而是采用常量,而且只有两个常量,没有别人
short result = 5 + 8;
System.out.println(result);
}
}