类型转换
数据类型转换是指把一个类型的变量转换为另外一个类型,包含两种方式:
一、自动类型转换(隐式类型转换)
小类型自动转为大类型,无需程序员干预:
int a = 1;
long b = a; // int 自动转为 long
long d = 5; // 5 是 int 类型,自动转为 long
double e = 3; // int 自动转为 doubleCode language: JavaScript (javascript)
二、强制类型转换
大类型转为小类型时,因为有可能发生数据丢失或溢出,需要程序员在代码中显式强制转换。风险由程序员自己把握,如果能保证不丢失或丢失不影响业务,则没问题。
long b = 10000000000L;
int c = (int) b; // 强制类型转换Code language: JavaScript (javascript)
数据类型从小到大排列
byte → short → char → int → long → float → double
强制类型转换的风险
1. 溢出(整数截断)
long g = 1000000000000000L;
int w = (int) g;
System.out.println(w); // 输出 -1530494976,高位被截断导致溢出Code language: JavaScript (javascript)
2. 精度丢失(小数转整数)
double a1 = 32.98;
int a2 = (int) a1;
System.out.println(a2); // 输出 32,小数部分被直接舍弃
double b1 = 32.0;
int b2 = (int) b1;
System.out.println(b2); // 输出 32,没有精度丢失Code language: JavaScript (javascript)
double 转换为 float 也可能会导致数据丢失。
三、数值运算时的自动类型提升
多种基本类型参与表达式运算时,运算结果会自动向较大的类型进行转换:
long l = 10000 + 233 * 2343243 * 23432432L; // 结果自动提升为 long
double d = 2345 - 123.3; // 结果自动提升为 doubleCode language: JavaScript (javascript)
四、byte、short、char 的特殊规则
1. 字面值直接赋值
整数型字面值默认是 int 类型,但可以直接赋值给 byte、short、char,只要不超过各自的范围:
byte bb1 = 3; // 正确,3 在 byte 范围内(-128 ~ 127)
// byte bb = 128; // 错误,超出 byte 最大范围 127Code language: JavaScript (javascript)
2. 参与运算时先提升为 int
byte、short、char 型数据参与运算时,会先一律自动转换为 int 类型再运算:
byte bb1 = 3;
byte bb2 = 5;
// byte bb3 = bb1 + bb2; // 错误!bb1+bb2 结果是 int 类型,不能直接赋给 byte
byte bb3 = (byte)(bb1 + bb2); // 正确,强制转回 byteCode language: JavaScript (javascript)
完整示例代码
public static void main(String[] args) {
long l = 12 + 23L; // 12 自动转为 long
int i = 45;
long j = i; // 自动类型转换
int k = (int) j; // 强制类型转换
double d = 46; // 自动类型转换
int t = (int) 123L; // 强制类型转换
long g = 1000000000000000L;
int w = (int) g;
System.out.println(w); // -1530494976
double a1 = 32.98;
int a2 = (int) a1;
System.out.println(a2); // 32
double b1 = 32.0;
int b2 = (int) b1;
System.out.println(b2); // 32
double d5 = 2345 - 123.3; // 自动提升为 double
// byte bb = 128; // 错误,超出 byte 范围
byte bb1 = 3;
byte bb2 = 5;
byte bb3 = (byte)(bb1 + bb2); // 必须强制转换
}Code language: JavaScript (javascript)
总结:自动类型转换安全但可能浪费空间,强制类型转换灵活但有风险。运算时
byte/short/char会隐式提升为int,赋值时需特别注意。
Previous: 布尔类型
Next: Scanner 的使用