1. 自动类型转化:
-
会将占用内存小的数据类型自动转化为占用内存大的数据类型。如:
int x=1;byte y=2;x=x+y;会自动将byte类型的数据y转化为int型然后相加; -
byte/short/char类型之间可以进行运算,但会自动类型转换为int类型后才进行运算。
如:byte num1=40,num2=50,sum;sum=num1+num2;会提示错误。因为运算以后其结果已经是int类型了,大范围的数据类型不能自动转化为小范围数据类型。 -
想显示字符类型的具体数值时,加一个int类型的0;这是利用自动类型转化的规则。如:
System.out.println('A'+0); //查看ASCII表值,’0‘--48 ;’A'--65 ;‘a'--97 System.out.println('中'+0);//查看Unicode表值,在Unicode表中开头的128个值保持和ASCII表相同
2. 强制类型转化:
- 格式:变量名=(要转换的数据类型)变量名或运算公式;
如int x=1;float y=2.1;x=(int)(x+y);原本x+y会自动转化为float类型,由于是为int类型的x赋值,float并不能自动转化为int类型,因此使用强制类型转化
强制类型转化会导致数据丢失,精度损失(不是四舍五入,而是直接丢弃),并且不可逆;
3. 编译器的常量优化
byte num1=40,num2=50,sum;
sum=(byte)(num1+num2);//需要进行强制数据类型转化
sum=40+50;//不需要强制类型转化
- 为什么num1在定义时int类型的40可以直接给num1赋值呢?
——对于byte、short、char三种数据类型,只要右侧数据没有超出数据类型的范围,那么Javac就会自动隐含地在数据之前补上强制类型转换,即byte num1=40会被编译器改写为byte num1=(byte)40;
——如果超过了左侧数据范围,编译器直接报错 - 为什么sum=40+50不需要进行强制类型转换;sum=(byte)num1+num2却需要?
——在为变量赋值时,如果右侧表达式只有常量,不含有变量,那么,javac编译器会将常量表达式的结果自动进行强制类型转换。一旦表达式含义变量,就必须手动地进行强制类型转化