上一期里我们提到了数据类型的分类:基本数据类型与引用数据类型。基本数据类型有数值型,字符型跟布尔型。本期,让我们来聊一聊基本数据类型的转换。
在进行Java编程的过程中,我们经常会遇到数据之间的传递,这时候就有可能出现类型不一致的现象。在Java中,不同的数据类型是不可以进行运算的。这时候,就需要数据类型转换登场了。
那么数据类型的转换究竟是怎么一回事呢?
数据类型转换,顾名思义,就是把一个数据类型转换为另一个数据类型。比如我想要把一个long类型的b与int类型的a相加,而我们想要得到一个int类型的值。我们可以用:
public static void main(String[] args) {
int i=3;
long j=4;
i=(int)(i+j);
}
来进行强制转换。
数据类型转换可分为两大类:隐式类型转换和强制类型转换。(除了boolean型之外,其余7种基本数据类型均可自由转换)
隐式类型转换(默认转换)
即容量小的数据类型转换为容量大的数据类型,系统一般会将小类型自动转换为大类型,这时不需要我们做什么,数据类型按照从小到大的排序为:byte,short,char->int->long->float->double。byte short char三者之间不能进行隐式转换。
这时候你可能会有疑惑,float 4个字节为什么会比long的8个字节容量大呢???
这是因为,浮点数在计算机中底层存储结构跟整数不一样。
浮点数的表示借鉴了科学计数法,比如在十进制中666.66可以表示为6.6666*10^2。类似地,浮点型数据的二进制存储结构也可以被划分成:符号位 + 指数位 + 尾数位。即V=(-1)^s * M * 2^E其中 s=为符号位, M=底数, E=幂(指数)。
具体想要了解可以参考这个网址:计算机是如何存储小数的https://www.jianshu.com/p/feebd5dd3ad5
需要注意的是:
1.byte short char三者在进行运算时首先会转换成int类型,然后在进行运算。
2.多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的 那一 种数据类型,然后再进行计算。例如:
long m = 2 + 10L + 10.2F + 10.5
这种情况输出的结果是double类型
强制类型转换(强制转换)
容量大的数据类型转换为容量小的数据类型,必须加上强制转换符。但是这个操作可能会造成精度降低或溢出现象比如以下几个代码:
public static void main(String[] args) {
int a = 12;
char b = (char)a;
System.out.println(b);
}
这时,输出的b是0,这就是所谓的溢出。(说人话就是小容量装不下大数字)
public static void main(String[] args) {
float a = 10.5f;
int b = (int)a;
System.out.println(b);
}
这种情况是精度丢失,它输出的结果是10,而非10.5。