【Java】强制类型转换

文章目录

  • 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);
    }
}

编译结果:
【Java】强制类型转换_第1张图片

  • 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类型。

你可能感兴趣的:(Java,强制类型转换,高精度数据类型,低精度数据类型)