一、自动类型提升
当容量小的数据类型与容量大的数据类型做运算时,结果会进行自动类型提升,自动提升为容量大的数据类型。
即
byte、short、char --> int --> long -->float -->double
当byte、char、short三种变量之间做运算时,做过为int型
例如
public class NumberTest(){
public static void main(String args[]){
byte b1 = 2;
short s1 = 1;
int sum1 = b1 + s1;//若sum1声明为byte或short型的变量,编译都不通过
}
}
当两个相同类型的变量相加时,也会出现自动类型提升的情况。
byte b1 = 127;
byte b2 = 1;
int sum1 = b1 + b2;//这时候sum1的数据类型是int型的
当这三个数据类型的变量与容量更大的变量做运算时,生成的会是那个更大的数据类型的变量。例如byte类型的变量与int类型的变量做运算,结果自动出来的int类型的变量。也可以手动提升为long型的变量。
byte b1 = 2;
int i1 = 129;
int sum1 = b1 + i1;//若 byte sum1 = b1 + i1;编译不通过
long l1 = b1 + i1;//这样手动的也是可以的。
特殊情况1
直接看代码
//通常情况下,long型变量的赋值是要在整数后面加l。
long l1 = 123213;
System.out.println(l1);//但这个时候编译没报错,且能正常运行。
原因:因为定义的变量值小于int的范围,系统默认他为int型。这也算一个自动类型提升。
特殊情况2
整数常量默认类型为int型;浮点型常量默认类型为double型
byte b = 12;
//byte b3 = b + 1;
//编译失败 因为此时b3的类型为int型
//float f1 = b + 12.3;
//编译失败,因为f1的类型为double型
特殊情况3
char c1 = 'a';//在Unicode表中a = 97
char c3 = 97;
char c4 = '5';
System.out.println(c3);//输出结果为a
System.out.println(c4);//输出结果为5
输出结果
强制类型转化
强制类型转化即自动类型提升的逆运算。
①需要使用强转符:() , 括号里面为需要转换的类型。
②进行强制类型转换时,可能导致精度丢失。
class VariableTest3{//强制类型转换
public static void main(String[] args){
double d1 = 12.9;
//精度损失举例1
int i1 = (int)d1;//截断操作,即d1后面的小数点全都舍去
System.out.println(i1);//输出结果为12
//精度损失举例2
int i2 = 128;
byte b = (byte)i2;
System.out.println(b);//输出结果为-128
}