Java数据类型转换从低类型转换为高类型,是一种自动类型转换;而反之,则需要加上 『(类型)』来做强制类型转换。
byte short(2 bytes) char(2 bytes) --> int (4) --> long (8) --> float (4) --> double (8).
(虽然long是64位,但是小数(float(32位), double)依然处于Java数据类型转换的高处)
注意:
1)做强制类型转换,容易产生两个问题:
a. 内存溢出;
b. 精度丢失;
package superlily.utils;
public class Demo03DataTransform {
public static void main(String[] args) {
//1. 从高到低做的是强制类型转换,容易发生内存溢出的情况
int i = 128;
byte b = (byte) i; //打开Byte你就能看到byte最大值是127; -128~127; 做了强制类型转换之后溢出了。
System.out.println(b); // -128
// 从低往高的数据类型转换是自动的,不需要加(double)
double d = i;
System.out.println(d); //128.0
//2. 强制类型转换时产生的精度丢失情况
float f1 = 123.89f;
float f2 = -43.89f;
System.out.println((int)f1); //123 (小数部分去掉了,数值变小了)
System.out.println((int)f2); //-43 (小数部分去掉了,数值变大了)
}
}
2) 运算之后的自动类型转换,注意类型转换是发生在计算之前还是计算之后。
如果类型转换之前已经完成了计算,而计算导致了内存溢出,此时错误已经发生,再转换的结果也是错误的;如果在计算之前做了类型转换,那么结果则不容易出错。下面通过一个例子说明:
int salary = 200_0000_000; //JDK7特性,数据之间可以用下划线分开便于阅读
int year = 2;
int result1 = salary * year; //-294967296
long result2 = salary * year; // -294967296 , 已经运算产生了结果再做的自动类型转换,错误已经发生,已经没用了。
long result3 = salary * (long)year; //4000000000,运算之前先做强制转换,避免在低类型下产生溢出。
long result4 = (long)salary * year; //4000000000
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
System.out.println(result4);
3) 类型转换的topic请不要带上boolean。也就是说布尔值不参与类型转换的~~~~