数据类型转换
强类型语言,运算时要用到类型转换。
//低容量 ----------------------------------------> 高容量
byte -> short -> char -> int -> long -> float -> double
PS:
- 类型从高 -> 低赋值,要强制转换。
- 类型从低 -> 高赋值,Java会自动转换。
- 布尔值(
boolean
)不能转换 - 不能转换不相关对象类型。
- 类型转换过程中会出现:1. 精度不准确;2. 内存溢出问题。
运算中,不同类型的数据要先转换成同一类型,再进行运算。
1. 高转低
示例:
public class Demo04 {
public static void main(String[] args) {
int i = 128 ;
//byte b = i ; //报错,i是整型,b是byte
byte b = (byte) i ; //强转,会出现内存溢出的问题
System.out.println(b);
}
}
输出:
-128
可以看到,不同类型直接赋值会报错。强制类型转换,高转低会出现数值过大,内存溢出问题。
2. 低转高
示例:
public class Demo04 {
public static void main(String[] args) {
byte b1 = 126 ;
double d = b1; //低转高,自动完成
System.out.println(d);
}
}
输出:
126.0
3. 强转导致精度不一
示例:
public class Demo04 {
public static void main(String[] args) {
System.out.println((byte)32.3f); //float
System.out.println((byte)41.93); //double 浮点类型会产生精度错误
}
}
输出:
32
41
从结果可以看出,float,double精度都丢失了。
4. 转换例子
public class Demo04 {
public static void main(String[] args) {
//字符转换
char c = 'a';
int ic = c + 1 ; //可以直接赋值,说明int容量比char大。
System.out.println(ic); //输出98
System.out.println((char)ic); //输出b
}
}
输出:
98
b
5. 大数据运算要注意强转的内存举出问题
示例:
public class Demo05 {
public static void main(String[] args) {
int money = 10_0000_0000;
int years = 20;
int total = money * years ; //输出 -1474836480,超出了int的最大值20E
long total1 = money * years ; //输出 -1474836480,计算后的结果已经溢出,再强转没意义;
long total2 = (long)money * years; //输出 20000000000,运算时要先强转为最大容量long,再运算能得出正确结果。
System.out.println(total);
System.out.println(total1);
System.out.println(total2);
}
}
输出:
-1474836480
-1474836480
20000000000