目录
- 简述
- 自动类型转换
- 特点
- 规则
- 强制类型转换
- 特点
- 格式
- 注意事项
- 数据溢出
- 精度损失
简述
- 当数据类型不一样是,将会发生数据类型转换。
- 数据类型转换分为两种:
- 自动类型转换(隐式)
- 强制类型转换(显式)
自动类型转换
特点
- 代码不需要进行特殊处理,自动完成
规则
数据范围从小到大
long num1 = 100;
System.out.println(num1);
- 左边是long类型,右边是默认的int类型,左右不一样
- 将右侧的int常量,交给左侧的long变量进行存储
- int --> long,符合数据范围从小到大的要求
- 第一行代码发生了自动数据类型转换,最后打印的是long类型
float num2 = 30L;
System.out.println(num2);
- 左边是float类型,右边是的long类型,左右不一样
- long --> float,范围是float更大一些,符合从小到大的规则
- 也发生了自动数据类型转换
- 最后的输出为float类型(30.0)
强制类型转换
特点
- 代码需要进行特殊的格式处理,不能自动完成
格式
- 范围小的类型 范围小的变量名 = (范围小的类型) 原本范围大的数据
int num = (int) 100L;
System.out.println(num);
- 左边是int类型,右边是long类型,不一样
- long --> int,不是从小到大
- 不能发生自动类型转换
- 按照格式进行强制类型转换(只是类型转换,数值不变)
注意事项
- 强制转换一般不推荐使用,因为有可能发生精度损失、数据溢出
- byte/short/char这三种类型都能发生数学运算,例如加法“+”
char类型会被以ASCII码的形式进行计算 - byte/short/char这三种类型在运算的时候,都会首先提升成为int类型,然后再计算。其他的计算会转换为范围较大变量的数据类型
byte num1 = 30;
byte num2 = 20;
short result = (int)(num1 + num2);
//byte + byte --> int + int (先提升为int类型) --> int
//int强制转换为short:注意必须保证逻辑上的真实大小本来就没有超过short范围,否则会发生数据溢出
System.out.println(result);
运行后会报错
Error:(5, 24) java: 不兼容的类型: 从int转换到short可能会有损失
int num1 = 10_0000_0000;
int num2 = 20;
System.out.println("================被赋值的变量类型为int===========");
int result1 = num1 * num2;
System.out.println("result1 = "+result1);
System.out.println("================被赋值的变量类型为long===========");
long result2 = num1 * num2;
System.out.println("result2 = "+result2);
System.out.println("======等号后赋值的变量强制转换为long,被复制到变量也为long======");
long result3 = (long)num1 * num2;
System.out.println("result3 = "+result3);
运行后结果:
================被赋值的变量类型为int===========
result1 = -1474836480
================被赋值的变量类型为long===========
result2 = -1474836480
================等号后赋值的变量强制转换为long,被复制到变量也为long===========
result3 = 20000000000
- 在执行运算时,运算前就已经把数据类型定下来了,运算后再进行强制转换还是会溢出。因此需要在运算前就将参加运算的变量强制转换成对应范围较大的数据类型(只用转换其中一个变量即可)
- tips:当一个String类型加一个其他数据类型时,最后的结果会拼接起来(如上方代码中所示)
- boolean类型不能发生强制类型转换
数据溢出
int num2 = (int) 600000000L;
System.out.println(num2);
- long类型强制转换成int类型
- 由于待转换的数据(600000000L)超出了int的范围,因此发生了数据溢出
- 最后的输出为1705032704
精度损失
int num3 = (int) 3.9;
System.out.println(num3);
- double --> int,范围从大到小,发生强制类型转换
- 最后输出的结果为3,发生了精度损失
- 注意这不是四舍五入,所有的小数位都会被舍弃掉