当容量小的数据类型与容量大的数据类型做运算时,结果会进行自动类型提升,自动提升为容量大的数据类型。
即
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 }