1、可以做运算的的基本数据类型有7种,不包含boolean类型。
2、运算规则包括:
自动类型提升
强制类型转换
自动类型提升
规则:当容量小的的变量与容量大的变量做运算时,结果自动转换为容量大的数据类型。
byte\short\char ---> int ---> long ---> float ---> double
说明:此时的容量小或大,并非指占用的内存空间的大小,而是指表示数据的范围的大小。
特殊:
byte、short、char类型的变量之间做运算,结果为int型。
byte b1 = 10;
byte b2 = 11;
short s1 = 12;
short s2 = 13;
//byte、short、char类型的变量之间做运算,结果为int型
//编译不通过
//byet b3 = b1 + b2;
//short s3 = s1 + s2;
//short s3 = s1 + b1;
int i1 = s1 + b1;
char c1 = 'a';
//编译不通过
//char c2 = c1 + b1;
int i2 = c1 + b1;
long型赋值不加后缀L默认为int型
long l1 = 123L;//占用8字节空间
long l2 = 123;//占用4字节空间,不报错,因为把123理解为int型,自动类型提升。
long l3 = 123123123123;//报错,因为把123123123123理解为int型,超出int范围
long l4 = 123123123123L;//不报错,此时的123123123123就是使用8字节空间的long型的值
float型赋值不加后缀F默认为double型
float f1 = 12.3f;//不报错
float f2 = 12.3;//报错,因为不加F默认double型,不满足自动类型提升(float<double)
整型常量,规定为int型
//整型常量,规定为int型
byte b1 = 10;
byte b2 = b1 + 1;//报错,因为整型常量,规定为int型
int i1 = b1 + 1;
浮点型常量,规定为double型
byte b1 = 10;
double b1 = b1 + 12.3;//浮点型常量,规定为double型
为什么标识符不能以数字开头? 为了防止硬性规则相互矛盾
//为什么标识符不能以数字开头?
int 123L = 10;
long l1 = 123L;
//为了“自洽”
强制类型转换
规则:
1、如果需要将容量大的变量的类型转换为容量小的变量类型,需要使用强制转换。
2、强制类型转换需要使用强转符()。在()内指明要转换为的数据类型。
3、强制类型转换过程中,可能导致精度损失。
double d1 = 12;
int i1 = (int)d1;
//打印结果为12
int i1 = 12;
float f1 = i1;//自动类型提升
System.out.println(f1);//打印结果为12.0
精度损失类型1:
double d1 = 12.3;
int i1 = (int)d1;
//打印结果为12,截断小数点后的所有
精度损失类型2:
int i1 = 128;
byte b1 = (byte)i1;
//打印结果为-128