说基本数据类型转换以前,先了解下 Java 中的 8 种基本数据类型,以及它们的占内存的容量大小和表示的范围,以下图所示。code
从新温故了下原始数据类型,如今来解释下它们之间的转换关系。blog
自动类型转换是指:数字表示范围小的数据类型能够自动转换成范围大的数据类型。教程
如:内存
long l = 100; int i = 200; long ll = i;
具体自动转换如以下图所示。get
实线表示自动转换时不会形成数据丢失,虚线则可能会出现数据丢失问题。编译
自动转换也要当心数据溢出问题,看下面的例子。数据类型
int count = 100000000; int price = 1999; long totalPrice = count * price;
编译没任何问题,但结果却输出的是负数,这是由于两个 int 相乘获得的结果是 int, 相乘的结果超出了 int 的表明范围。这种状况,通常把第一个数据转换成范围大的数据类型再和其余的数据进行运算。im
int count = 100000000; int price = 1999; long totalPrice = (long) count * price;
另外,向下转换时能够直接将 int 常量字面量赋值给 byte、short、char 等数据类型,而不须要强制转换,只要该常量值不超过该类型的表示范围都能自动转换。技术
强制类型转换咱们再清楚不过了,即强制显示的把一个数据类型转换为另一种数据类型。qq
如:
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 型,运算结果正常,没有出现溢出的状况。