java基础数据类型转换
java基础数据类型转换
了解了java的基础数据类型之后,感觉有必要拓展一下基础数据类型的转换。数据类型转换又分为自动转换和强制类型转换。
一、自动类型转换
自动类型转换就是将取值范围小的类型自动提升为取值范围大的类型。
如:
int a = 100; // 默认为int
long b = a; // 自动转换为long
System.out.println(b); // 100
但是如果我们将int的值赋值给short时就会报错(编译不成功):
int a = 100;
short b = a; // Error:(13, 27) java: 不兼容的类型: 从int转换到short可能会有损失
System.out.println(b);
同理,我们可以把float自动转换为double,但是double不能自动转换为float,因为double的取值范围比float大。
二、强制类型转换
强制类型转换需要进行特殊的格式处理,不能自动完成。但是强制类型转换不推荐使用,因为会发生精度丢失或数据溢出的情况。
格式:范围小的变量 = (范围小的类型) 范围大的变量
int a = (int) 100L;
System.out.println(a); // 100
以上是正常的强制类型转换,下面丢失精度和数据溢出的例子:
// 数据溢出
int a = 300;
byte b = (byte) a;
System.out.println(b); // 44
0000 0000 0000 0000 0000 0001 0010 1100 300对应的int类型存储,共8字节,在转换为byte之后只会保留一个字节,变成0010 1100,转换为十进制就是44
// 丢失精度
double a = 300.99;
int b = (int) a;
System.out.println(b); // 300
double类型强制转换为int之后,后面的小数位会直接丢失。
三、 注意事项
类型提升现象
// 所谓类型提升就是指在多种不同数据类型的表达式中,类型会自动向范围表示大的值的数据类型提升。
int a = 100000000;
int b = 1999;
long c = a * b;
System.out.println(c); // -1963462912
// a * b返回的是int类型,由于超过了int的取值范围,所以就发生了数据溢出
// 现在将a改为long类型
long a = 100000000;
int b = 1999;
long c = a * b;
System.out.println(c); // 199900000000
// a是long类型,b是int类型,a和b的计算结果也是long类型,运算结果正常。
字符
// 字符可以直接参与运算,取值为ASCII码对应的位置
// ASCII (American Standard Code for Information Interchange): 美国信息交换标准代码
// Unicode 万国码,开头0-127跟ASCII码表相同,从128开始包含更多字符
char a = 'A';
int b = 0;
System.out.println(a + b); // 65
ASCII码表 '0' = 48 'A' = 65 'a' = 97
byte/short/char 计算
byte/short/char 这三种类型都可以直接发生数学运算,但是在运算之前都会首先提升为int类型,然后再计算
byte a = 10;
byte b = 10;
// byte + byte --> int + int --> int
byte c = a + b;
// 报错 Error:(14, 28) java: 不兼容的类型: 从int转换到byte可能会有损失
boolean类型
boolean类型虽然实际存储的是数字,但是在java中boolean类型不能发生数据类型转换
boolean a = true;
int b = (int) a;
System.out.println(b);
// 报错 Error:(13, 31) java: 不兼容的类型: boolean无法转换为int

浙公网安备 33010602011771号