/*
* 在Java中,整数类型(byte/short/int/long)中,对于未声明数据类型的整形,其默认类型为int型。
* 在浮点类型(float/double)中,对于未声明数据类型的浮点型,默认为double型。
* float a = 3.12F;
* long b = 1111111111111L;
*/
1、基本数据类型中类型的自动提升
类型 | 存储需求 | 取值范围 |
int | 4字节 | -2147483648 ~ 2147483648 |
short | 2字节 | -32768 ~ 32768 |
long | 8字节 | -9223372036854775808 ~ 9223372036854775808 |
byte | 1字节 | -128 ~ 127 |
float | 4字节 | ±3.40282347E+38F(有效位数为6~7位) |
double | 8字节 | ±1.79769313486231570E+308(有效位数15位) |
char | 2字节 | 0 ~ 65535 |
当将一个数值范围小的类型赋给一个数值范围大的数值型变量,jvm在编译过程中俊将此数值的类型进行了自动提升。
在数值类型的自动类型提升过程中,数值精度至少不应该降低(整型保持不变,float->double精度将变高)。
* char型其本身是unsigned型,同时具有两个字节,这直接导致byte型不能自动类型提升到char,char和short直接也不会发生自动类型提升(因为负数的问题),同时,byte当然可以直接提升到short型。
2、隐式类型转换
隐式转换也叫作自动类型转换, 由系统自动完成.
从存储范围小的类型到存储范围大的类型.
byte ->short(char)->int->long->float->double
* int z =10;
* long q = z;
3、显示类型转换
显示类型转换也叫作强制类型转换, 是从存储范围大的类型到存储范围小的类型.
当我们需要将数值范围较大的数值类型赋给数值范围较小的数值类型变量时,由于此时可能会丢失精度(1讲到的从int到k型的隐式转换除外),因此,需要人为进行转换。我们称之为强制类型转换。
double→float→long→int→short(char)→byte
* int a = 23;
* byte b = (byte)a;
4、进行数学运算时的数据类型自动提升与可能需要的强制类型转换
当进行数学运算时,数据类型会自动发生提升到运算符左右之较大者,以此类推。当将最后的运算结果赋值给指定的数值类型时,可能需要进行强制类型转换。例如:
a+b会自动提升为int, 因此在给c赋值的时候要强制转换成byte.