文章目录
- 1. 基本概念
- 2. 应用场景
- 3. 使用风险
- 4. 使用规则
- 5. 训练
1. 基本概念
强制类型转换,可以理解为自动类型转换的逆过程。是将大容量的数据类型转换为小容量的数据类型。
使用时,前面要加上强制类型转换符号()
。
2. 应用场景
需要将数据从高精度数据类型转换为低精度数据类型。(即高精度类型的数据不能直接赋值给低精度数据)
【注】Java中数据类型的精度从低到高的顺序为:
- byte
- short
- int
- long
- float
- double
3. 使用风险
程序中使用强制类型转换,可能面临以下2种风险:
- 精度损失。
- 数据溢出。
程序示例:
public class ForceConvert{
public static void main(String[] args){
//风险1:精度降低
double a = 1.9;
int b = (int)a;
System.out.println(b);//造成精度降低,输出1
//风险2:数据溢出
int c = 1000;//对应二进制为11 1110 1000
byte d = (byte)c;//强制转换为byte类型,直接截去11 1110 1000超出低8位的二进制,变为1110 1000。
//因为java中整型都是有符号,所以1110 1000的最高位是符号位,为1则表示是一个负数。
//计算机中,正数的原码等于补码,而负数的原码不等于补码。
//计算机中,用二进制的补码来存储数据。
//所以,1110 1000是补码,转换成原码就是1001 1000,就是-24。
//补码转换为原码的方法:符号位不变,从右边往左边数,第一个不是0的后面依次取反。
System.out.println(d);//造成数据溢出,输出-24
}
}
运行结果:
4. 使用规则
- 强制类型转换符号(),只对最近的操作数有效。可以使用小括号来提升优先级。
程序示例:
public class ForceConvert1{
public static void main(String[] args){
//强制类型转换符号(),只对最近的操作数有效。可以使用小括号来提升优先级。
int a = (int)(10 * 3.5 + 1.5 * 6);
int b = (int)10 * 3.5 + 1.5 * 6;//编译会报错。因为等号右边的运算结果是double类型,不能直接赋值给int型的变量a。
System.out.println(a);
System.out.println(b);
}
}
编译结果:
- char类型的变量可以保存默认为int类型的常量(前提是常量的值在char类型的范围内),但是不能直接保存为int类型的变量值,需要进行强制类型转换。
char c1 = 100;
int a = 100;
char c2 = a;//程序编译会报错。
char c3 = (char)a;
- char、byte、short三种类型在进行混合运算时,会自动提升数据类型,先转换成int型。
- Java中,用常量(默认数据类型为int)来给变量(数据类型为byte、short、char)赋值时,只要常量的值在该变量所述数据类型的有效范围内,则就可以正常赋值。
5. 训练
判断以下哪些语句会报错。
short s = 12;//对,因为12在short类型的范围内。
s = s - 9;//错,等号右边为int类型,int类型数据不能直接赋值给short类型。
byte b = 10;//对,因为10在byte类型的范围内。
b = b + 11;//错,等号右边为int类型,int类型数据不能直接赋值给byte类型。
b = (byte)(b + 11);//对,等号右边为int类型,int类型数据通过强转,赋值给byte类型。
char c = 'a';//对
int i = 16;//对
float d = .314F;//对
double result = c + i + d;//对,等号右边的运算结果是float类型,float类型可以直接赋值给double类型
byte b = 16;//对
short s =14;//对
short t = s + b;//错,等号右边的运算结果是int类型,int类型不能直接赋值给short类型。