介绍
一些场景中,需要将一种数据类型转为另一种数据类型,可能是自动进行了转换,包括:
-
赋值
比如
double d = 1;
提供的字面值(1, 为int)和变量的类型(double)不一样。 -
计算
比如
3.14 + 2
, 两种不同数据类型进行运算。 -
函数参数
比如
void foo(int i){}; foo('a');
, 实参和形参的类型不一样。
在这些场景中, 需要了解数据间转换的规则。
基本数据类型自动转换
范围小的数据类型可以转为大的数据类型,反过来不行。可以看下图:
箭头代表可以进行转换,虚线箭头说明转换后可能有精度损失。
赋值和函数传参
例子:
short s = 1;
int i = s; // ok
// s = i; // error
float f = i;
void foo(int i) {
}
foo('a'); // char可以转为int
运算
算术运算的两个操作数a, b, 比如 a + b, 如果a, b的类型不一样,需要先转为一样的类型:
如果两个操作数中有一个是double, 另一个就会转为double
否则,如果一个是float, 另一个就会转为float
否则,如果一个是long, 另一个就会转为long
否则,两个数都转为int
例子:
byte b1 = 1;
byte b2 = 2;
// byte sum = b1 + b2; // error, b1 + b2的结果是int
int sum = b1 + b2; // ok
double d = 1.0;
int i = 1;
// int sum = d + i; // error
double sum1 = d + i;
基本数据类型的强转
当需要将 大范围类型 转换为 小范围类型 时,必须使用强制类型转换,但是结果可能不是你预期的。
-
大范围整数类型强转为小整数类型, 会截取补码二进制表示的低x位
int i = 255; byte b = (byte) i; System.out.println(b); // output: -1
-
浮点数转为整数会截取小数部分
double d = 3.14; int i = (int) d; System.out.println(i); // output: 3
-
boolean 不能与其他类型转换
boolean b = true; // int i = (int)b; // error
String 和基本数据类型间的转换
-
基本数据类型转为String
int num = 100; String str1 = String.valueOf(num); // "100" String str2 = Integer.toString(num); // "100" String str3 = "" + num; // "100" String str4