目录
程序的运行,有时涉及到类型的转化,类型的转化涉及到自动类型转化和强制类型转化。
1、自动类型转换
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型,如下图,红色实线表示无数据丢失的自动类型转换,而蓝色虚线表示在转换时可能会有精度的损失。
这里的容量并不是指占用字节数的大小,而是指数值的表示范围的,那同样是占用4个字节的int类型和float类型,为何float类型的容量要比int类型的大,这就看float类型在低层的表示方https://blog.csdn.net/lgl782519197/article/details/89878900。
特例:
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
至于为何会损失精度,看这里,https://blog.csdn.net/bailang_zhizun/article/details/84315329(int转float时精度损失问题),其他丢失精度的问题,原理是一样的。
为何精度丢失了,用==号比较的时候,还是true呢,因为比较的时候,会把==号左右2端的数据转为同一个类型,然后再进行比较。