目录

​1、自动类型转换​

​2、强制类型转换​

​3、转换溢出​


程序的运行,有时涉及到类型的转化,类型的转化涉及到自动类型转化和强制类型转化。

1、自动类型转换

自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型,如下图,红色实线表示无数据丢失的自动类型转换,而蓝色虚线表示在转换时可能会有精度的损失。

数据类型转化(详解与代码)_数据类型

这里的容量并不是指占用字节数的大小,而是指数值的表示范围的,那同样是占用4个字节的int类型和float类型,为何float类型的容量要比int类型的大,这就看float类型在低层的表示


特例:

1、可以将整型常量直接赋值给byte、short、char等类型,而不需要进行强制类型转换,只要不超出其表数范围即可。



public class TestAutomaticTypeConversion {

/**
* @param args
*/
public static void main(String[] args) {
byte byte1 = 50;
short short1 = byte1;
System.out.println("byte转short----------------------------");
System.out.println("byte1="+byte1); //50
System.out.println("【short1 = byte1】short1="+short1);//50
System.out.println("【short1 == byte1】="+(short1 == byte1));//true
char char1 = 'a';
int int1 = byte1;
System.out.println("byte转int----------------------------");
System.out.println("byte1="+byte1); //50
System.out.println("【int1 = byte1】int1="+int1);//50
System.out.println("【int1 == byte1】="+(int1 == byte1));//true
int1 = short1;
System.out.println("short转int----------------------------");
System.out.println("short1="+short1); //50
System.out.println("【int1 = short1】int1="+int1);//50
System.out.println("【int1 == short1】="+(int1 == short1));//true
int1 = char1;
System.out.println("char转int----------------------------");
System.out.println("char1="+char1); //a
System.out.println("【int1 = char1】int1="+int1);//97
System.out.println("【int1 == char1】="+(int1 == char1));//true
int1 = 2147395599;
long long1 = int1;
System.out.println("int转long----------------------------");
System.out.println("int1="+int1); //2147395599
System.out.println("【long1 = int1】long1="+long1); //2147395599
System.out.println("【long1 == int1】="+(long1 == int1));//true
int1 = 2147395599;
float float1 = int1;
System.out.println("int转float----------------------------");
System.out.println("int1="+int1); //2147395599
System.out.println("【float1 = int1】float1="+float1); //2.14739558E9,损失精度
System.out.println("【float1 == int1】="+(float1 == int1));//true,低层运算会先转为同一个类型,再比较
int1 = 2147395599;
double double1 = int1;
System.out.println("int转double----------------------------");
System.out.println("int1="+int1); //2147395599
System.out.println("【double1 = int1】double1="+double1); //2.147395599E9
System.out.println("【double1 == int1】="+(double1 == int1));//true
long1 = 1234569999999999999L;
float1 = long1;
System.out.println("long转float----------------------------");
System.out.println("long1="+long1); //1234569999999999999
System.out.println("【float1 = long1】float1="+float1); //1.23457E18,损失精度
System.out.println("【float1 == long1】="+(float1 == long1));//true,低层运算会先转为同一个类型,再比较失
long1 = 1234569999999999999L;
double1 = long1;
System.out.println("long转double----------------------------");
System.out.println("long1="+long1); //1234569999999999999
System.out.println("【double1 = long1】double1="+double1); //1.23457E18,损失精度
System.out.println("【double1 == long1】="+(double1 == long1));//true,低层运算会先转为同一个类型,再比较
float1 = 2.14739558E9F;
double1 = float1;
System.out.println("float转double----------------------------");
System.out.println("float1="+float1); //2.14739558E9
System.out.println("【double1 = float1】double1="+double1); //2.147395584E9,损失精度
System.out.println("【double1 == float1】="+(double1 == float1));//true,低层运算会先转为同一个类型,再比较

float1 = 2.14739558E8F;
double1 = float1;
System.out.println("float转double----------------------------");
System.out.println("float1="+float1); //2.14739552E8
System.out.println("【double1 = float1】double1="+double1);//2.14739552E8,未损失精度
System.out.println("【double1 == float1】="+(double1 == float1));//true
float1 = 2.14739558E9F;
double1 = Double.valueOf(String.valueOf(float1));
System.out.println("float转double----------------------------");
System.out.println("float1 ="+float1);
System.out.println("double1 ="+double1 );
byte1 = 127;
System.out.println("byte1 ="+byte1 );//127,不需要进行强制类型转换,只要不超出其表数范围即可。
//byte1 = 128;//报错,128超过了byte的表数范围
System.out.println("Byte最大值 ="+Byte.MAX_VALUE );
}

结果

byte转short----------------------------
byte1=50
【short1 = byte1】short1=50
【short1 == byte1】=true
byte转int----------------------------
byte1=50
【int1 = byte1】int1=50
【int1 == byte1】=true
short转int----------------------------
short1=50
【int1 = short1】int1=50
【int1 == short1】=true
char转int----------------------------
char1=a
【int1 = char1】int1=97
【int1 == char1】=true
int转long----------------------------
int1=2147395599
【long1 = int1】long1=2147395599
【long1 == int1】=true
int转float----------------------------
int1=2147395599
【float1 = int1】float1=2.14739558E9
【float1 == int1】=true
int转double----------------------------
int1=2147395599
【double1 = int1】double1=2.147395599E9
【double1 == int1】=true
long转float----------------------------
long1=1234569999999999999
【float1 = long1】float1=1.23457E18
【float1 == long1】=true
long转double----------------------------
long1=1234569999999999999
【double1 = long1】double1=1.23457E18
【double1 == long1】=true
float转double----------------------------
float1=2.14739558E9
【double1 = float1】double1=2.147395584E9
【double1 == float1】=true
float转double----------------------------
float1=2.14739552E8
【double1 = float1】double1=2.14739552E8
【double1 == float1】=true
float转double----------------------------
float1 =2.14739558E9
double1 =2.14739558E9
byte1 =127
Byte最大值 =127

 至于为何会损失精度,看这里​(int转float时精度损失问题),其他丢失精度的问题,原理是一样的。


为何精度丢失了,用==号比较的时候,还是true呢,在进行比较前,会自动把==号左右2端的数据进行类型的隐式向上转换,把前后参数的类型转换为相同类型。然后再进行比较。(比如 int 跟 long比较,是转成long再比较)


2、强制类型转换

强制类型转化,又被称为造型,用于显示的转换一个数值的类型。通过造型来完成的强制类型转换,很有可能丢失信息,也有可能造成进度降低或溢出。 


语法:(type)var        type表示将值var想要转换成为目标的数据类型


public class TestMandatoryTypeConversion {

/**
* @param args
*/
public static void main(String[] args) {
double a = 2.399;
int b = (int)a;
char c = 'a';
int d = c+2;
System.out.println("b="+b); //b=2;小数位丢失
System.out.println("d="+d);
System.out.println("d="+(char)d); //a=97;97+2=99;99对应的字符为c
}

}

结果

b=2
d=99
d=c

3、转换溢出

类型转换中,操作数比较大是,经常发生溢出

public class TestTypeConversionOverflow {

/**
* @param args
*/
public static void main(String[] args) {
int a = 1000000000; //10亿
int b = 20;
int c = a*b; //200亿已经超过了int的表数范围,变为-1474836480
long d = a*b; //相乘结果是int,200亿已经超过了int的表数范围,变为-1474836480,再转为long
long e = a*(long)b; //先转为long,结果还是long
System.out.println("c="+c);
System.out.println("d="+d);
System.out.println("e="+e);
}

}

结果

c=-1474836480
d=-1474836480
e=20000000000