public static void main(String[] args)
{
byte b = 4;
b = 3+7 ; 这个代码在编译时不会报错
byte a = 4;
byte c = 5;
b =a+c; 这个代码在编译时会报错
System.out.println(b);
}
原因分析 :
在程序中只要见到整数默认都是int类型的
byte b=4; 4是int类型 编译器在运行的时候判断4这个字节是不是在byte的范围内
如果在范围内,就把4做了一次默认的强转 ,把最后把4的有效字节赋值到了b这个变量当中
所以底层会做这个自动转换过程 ,编译器会做检查并做自动转换
byte b :-128~127
4只需要用一个字节来表示,其他都为0 判断在byte的范围之内
就把4的值赋给b
b1和b2都是变量 数值会发生变化,值不确定(b1,b2具体的值不确定,不清楚) 编译器不能做出检查,检查不了
eg :
byte b = 3+7 ;
右边是常量,值不会发生变化,编译器可以进行判断是否在byte 范围内
byte b =5;
byte c =1;
byte a = 1'
a = b+c ; 右边不确定,是无法进行判断 ,所有编译会报错
总结就是:判断数据类型能不不能装的下
short s=3;
// 先检查,判断在范围,再做转换
s+=4;
// 1次运算 编译正常 先赋值2边的和,在进行判断,再进行自动转换
//s=(short)(s+4) 在底层做了强制类型转换 是赋值运算的特点
// 在 底层赋值过程当中,做了强制转换动作
s=s+4 // 2次运算 损失精度 无法判断 所以不进行自动转换动作,
// 进行了自动类型的提升,类型已经不能再赋给低值(低空间)类型,因为会发生精度丢失