说基本数据类型转换之前,先了解下 Java 中的 8 种基本数据类型
- byte(一个字节) 的取值范围:-128~127(-2的7次方到2的7次方-1)
- short (两个字节)的取值范围:-32768~32767(-2的15次方到2的15次方-1),为万级别的
- int (四个字节)的取值范围:-2147483648~2147483647(-2的31次方到2的31次方-1),为十亿级别的
- long(八个直接) 的取值范围:-9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1),为百亿亿级别的
- float(单精度浮点型)取值范围:3.402823e+38~1.401298e-45(e+38 表示乘以10的38次方,而e-45 表示乘以10的负45次方)
- double(双精度浮点型)取值范围:1.797693e+308~4.9000000e-324
- char:占两个字节
- boolean:只占一位
所以说int在日常中就已经满足我们的需要了
自动类型转换
自动类型转换是指:数字表示范围小的数据类型可以自动转换成范围大的数据类型。如:
long l = 100;
int i = 200;
long ll = i;
实线表示自动转换时不会造成数据丢失,虚线则可能会出现数据丢失问题。自动转换也要小心数据溢出问题,看下面的例子。
int count = 100000000;
int price = 1999;
long totalPrice = count * price;
编译没任何问题,但结果却输出的是负数,这是因为两个 int 相乘得到的结果是 int, 相乘的结果超出了 int 的代表范围。这种情况,一般把第一个数据转换成范围大的数据类型再和其他的数据进行运算。
int count = 100000000;
int price = 1999;
long totalPrice = (long) count * price;
另外,向下转换时可以直接将 int 常量字面量赋值给 byte、short、char 等数据类型,而不需要强制转换,只要该常量值不超过该类型的表示范围都能自动转换。
强制类型转换
强制类型转换我们再清楚不过了,即强制显示的把一个数据类型转换为另外一种数据类型。如:
short s = 199;
int i = s;// 199
double d = 10.24;
long ll = (long) d;// 10
以上的转换结果都在我们的预期之内,属于正常的转换和丢失精度的情况,下面的例子就一样属于数据溢出的情况。
int ii = 300;
byte b = (byte)ii;
300 已经超出了 byte 类型表示的范围,所以会转换成一个毫无意义的数字。
类型提升
所谓类型提升就是指在多种不同数据类型的表达式中,类型会自动向范围表示大的值的数据类型提升。把上面的溢出的例子再改下。long count = 100000000;
int price = 1999;
long totalPrice = price * count;
price 为 int 型,count 为 long 型,运算结果为 long 型,运算结果正常,没有出现溢出的情况。