前言:Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。
自动类型转换
特点:无需处理,自动转换
规则:从小到大转换
public class test{
public static void main(String[] args){
System.out.println(100); //整型 默认int
System.out.println(5.3); //浮点型 默认double
//左边是long型,右边是int型,将int型转为long型储存在a 是自动类型转换
long a=5;
System.out.println(a);
//左边是double型,右边是float型,将float型转为double型储存在b是自动类型转换
double b=2.5F;
System.out.println(b);
//左边是float型,右边是long型,将long型转为float型储存在c是自动类型转换
float c=80L;
System.out.println(c);
}
一个 int 类型变量和一个 byte 类型变量进行加法运算, 结果会是什么数据类型?
用下面数据自己测试一下试试!
int a = 1;
byte b = 2;
byte x = b + i; // 报错
int j = b + i;//正确
所以运算结果变量的类型将是 int 类型。
所以说,自动转换:是将取值范围小的类型 自动提升为 取值范围大的类型 。
那么,为什么能变成int而不是byte呢?、
因为 byte一个字节,而int四个字节 再计算的时候 会将byte补充为4个字节之后再和int型数据计算,所以最后结果为4个字节为int型。
同理,当int和double计算时,结果将会变为double型。
总结从小到大范围:byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double
强制类型转换
特点:需要修改代码,不能自动转换
规则:小类型 变量名=(小类型)大数据
运行以下代码:
public class test{
public static void main(String[] args){
//左边是int型,右边是long型,将long型转为int型,是从大到小转换,不是从小到大,不能自动转换
int a=100L;
System.out.println(a);
}
}
修改以后的代码
按照规则:小类型 变量名=(小类型)大数据 进行修改后运行 将long强转为int型
public class test{
public static void main(String[] args){
//左边是long型,右边是int型,将int型转为long型储存在a 是自动类型转换
int a=(int)100L;
System.out.println(a);
}
}
运行以下代码,将会输出66 为什么 因为char型的字母A对应ASCII表中的65 所以char型数据在进行数学运算时会变为对应数字
public class test{
public static void main(String[] args){
char a='A';
System.out.println(a+1);
}
}
注意事项
强制类型转换一般不推荐使用的 因为可能出现两个问题:溢出,精度损失。
int 强制转成 short 砍掉2个字节,可能造成数据丢失。
精度损失
看下方代码:
int i = 1.5; // 错误
这里显然不能将double型自动转为int
double 类型内存8个字节, int 类型内存4个字节。 1.5 是 double 类型,取值范围大于 int 。可以理解为 double 是8 升的水壶, int 是4升的水壶,不能把大水壶中的水直接放进小水壶去。想要赋值成功,只有通过强制类型转换,将 double 类型强制转换成 int 类型才能赋值。
如何修改呢?如下:
int i = (int)1.5;
输出结果是什么 ? 答案是1 (切记不是四舍五入,不然输出就是1了 这里是直接去掉小数点的 即使是1.99也是输出1) 这就叫做精度损失
溢出
// int i = 8888888888; //显然是错误的 8888888888已经超出的int的最大表示范围 会报错
int i= (int)8888888888L // 输出298954296 因为溢出了