自动转化:自动转化又称为隐式转化,就是数据范围小的数据类型自动会被JVM转化为数据范围大的数据类型;例:杯子里面的水可以装在桶里面
强制转化:就是数据范围大的被存储到数据范围小的数据类型中;例:桶里面的水 不能直接被装在杯子里面,如果是想把桶里面的水装到瓶子里,前提是桶里面的水刚好可以装到瓶子里面,如果是桶里面的水比瓶子容量大的话,则会发生溢出,此处就像数据范围大的数据类型的数据装到数据类型小的中,则会损失精度,该精度损失要取决于开发中是否能被忽略。
1. 基本数据类型转化图
char —————>|
=============|——–>int—–>long—->float—–>double
byte、short ——>|
2. 基本数据类型的<变量>运算
byte b1 = 1;
byte b2 = 2;
short s1 = 1;
short s2 = 2;
char c1 = 1;
char c2 = 2;
//以下运算报错:int转化为byte会有损失 因为byte进行数据运算的时候JVM会自动将数据类型提升为int类型
//则等号右边的运算结果为int类型,而等号左边的接受类型为byte 所以数据范围大的转化为数据范围小的会有
//数据丢失,即溢出
// byte b3 = b1 + b2;//错误: 不兼容的类型: 从int转换到byte可能会有损失 所以在进行数据处理上要让程序员进行来取决其数据损失可以被忽略与否即进行强制转化
// short s3 = s1 + s2;//错误: 不兼容的类型: 从int转换到short可能会有损失
// char c3 = c1 + c2;//错误: 不兼容的类型: 从int转换到char可能会有损失
// char c4 = b1 + s2;// 错误: 不兼容的类型: 从int转换到char可能会有损失
/*
等号右半边的数据类型无论是byte、short、char的一种以及混合运算其运算都会被提升为int类型
*/
//byte b6 = b1 + 1;//错误: 不兼容的类型: 从int转换到short可能会有损失
// short s4 = b1 + c2;//错误: 不兼容的类型: 从int转换到short可能会有损失
long l1 = 1;
long l2 = 2;
float f1 = 1;
float f2 = 2;
// long l3 = f1 + 1;//错误: 不兼容的类型: 从float转换到long可能会有损失
//同时也要注意数据类型提升的时候,long类型会自行被提升为float类型
float f3 = l1 + l2;
3. 基本数据类型<常量>运算
/*
byte、short、char这三种常量运算JVM都会进行优化的,如果是超出其数据表示的范围的话,则会被自动转化为int类型
*/
byte b4 = 1 + 3;//当进行常量运算的时候JVM会对其进行优化,前提是不能超过其数据范围-128~127,若超出其数据表示的范围则会报错,以下则是具体例子
// byte b5 = 1 + 127;//错误: 不兼容的类型: 从int转换到byte可能会有损失
short s5 = 1 + 4;//当进行常量运算的时候JVM会对其进行优化,前提是不能超过其数据范围-32768~32767,若超出其数据表示的范围则会报错,以下则是具体例子
// short s6 = 1 + 32767;//错误: 不兼容的类型: 从int转换到short可能会有损失
char c5 = 2 + 1;//当进行常量运算的时候JVM会对其进行优化,前提是不能超过其数据范围0~65535,若超出其数据表示的范围则会报错,以下则是具体例子
// char c6 = 1 + 65535;错误: 不兼容的类型: 从int转换到short可能会有损失 char类型相当于一个无符号整数,所以取值范围为0~65535
总结:
数据类型进行运算的时候首先要看赋值号(=)的右边的运算结果的类型,然后在进行看赋值号左边的数据类型
如果是类型相同的话,则可以赋值;
如果不同的话,如果是范围大的数据类型赋值给范围小的数据类型的话,则会报错,否则使用强制类型转化
如果是范围小的数据类型赋值给范围大的数据类型的话,则JVM进行自动转化的
特殊记:
byte、short、char这三种常量运算JVM都会进行优化为int类型进行运算的;
char类型使用两个字节保存该数据,但是其相当于是一个无符号整数取值范围是0~65535
long类型也会被自动转化为float类型的;
其他的数据类型进行运算的话,都遵循上面基本数据类型转化图即可
———————-刚写博客还希望大家批评指正相互学习————————————-