概述
Java程序中要求参与的计算的数据,必须要保证 数据类型的一致性,如果数据类型 不一致 要进行 类型转换。
类型转换分为:
- 自动转换(隐式转换)
- 强制转换
归纳
整型之间:
- 范围小 赋值给 范围大,隐式转换(不需要额外处理)
- 范围大 赋值给 范围小,强制转换
浮点型之间
- 范围小 赋值给 范围大,隐式转换(不需要额外处理)
- 范围大 赋值给 范围小,强制转换
整型 赋值 浮点型:隐式转换,不考虑范围
浮点型 赋值 整型:需要 强制转换(理解:如果不强制转换,无法处理小数部分)
自动转换
将 值范围小 的类型,自动 提升为 值范围大 的类型 。
赋值时
public class Main {
public static void main(String[] args) {
int i=123;
long l=i;
System.out.println(i);
System.out.println(l);
}
}
将int型变量,赋给long型,自动转换
可以理解为:将 碗 中的水,倒入 盆 中
运算时
一个 int 型变量和一个 long 型变量进行加法运算, 结果是什么类型?
public class Test {
public static void main(String[] args) {
int i=123;
long l=1000;
//int类型和long类型运算,结果是long类型
long x = i+l;
// int x=i+l;//报错。long型的值,不能赋给 int型变量,理解:将一盆水,倒入碗中,倒不下
System.out.println(x);
}
}
运算结果是 long 型
总结:取值范围小的类型,与 取值范围大的类型,做运算时,结果是 取值范围大 的类型
可以理解为:一碗水,加上一盆水,结果用盆来装更合理
int型与double型运算时
同样道理,当一个 int 类型变量和一个 double 变量运算时, int 类型将会自动提升为 double 类型进行运算。
public static void main(String[] args) {
int i = 1;
double d = 2.5;
//int类型和double类型运算,结果是double类型
//int类型会提升为double类型
double e = d+i;
System.out.println(e);
}
+=运算
阅读下面的程序,是否有错误
public static void main(String[] args){
short s = 1;
long a=1000;
s += a;// s = (short)s+a,其结果应该是long,自带强制转换的效果
// s = (short) (s+a);// (强制转换的类型)值、变量、运算
System.out.println(s);
}
错误分析:
代码 s += a 可以理解为 s = s + a, 根据上面的理论,计算结果被提升为 long型。
再向short类型变量赋值时,应该发生错误
因为不能将取值范围 大的类型赋值到取值范围小的类型。
正确解释:
符号 += 比较特殊,带有 强制转换 的特点, 也就是说 s += a 可以理解为 s = (short) (s+a)
因此程序可以正确执行
总结:
范围小 的类型,向 范围大 的类型 转换,是 java 自动转换 的
将 碗 中的水,倒入到 盆 中,是一件很自然的事,不需要额外操作
byte、short、char 运算时直接提升为 int
byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double
+= 、-= 、*= 、/= 、%= 自动强制转换
强制转换
赋值时
问题一:
public class Main {
public static void main(String[] args) {
long l=123;
int i=l;//报错
System.out.println(i);
System.out.println(l);
}
}
long 型占8个字节,int 类型占4个字节,long 取值范围大于 int,将 long型 赋给 int 型,会报错
可以理解为:将 盆 中的水,倒入 碗 中,水可能会溢出,所以 不能 直接操作
问题二:
将 小数(浮点数) 赋值到 int 类型变量也会报错
int i=1.5;// 错误
整型变量无法存放小数
运算时
public static void main(String[] args) {
int i=100;
long l=200;
int x=i+l;//i+l,其结果自动转换成long型
System.out.println(x);
}
强制转换
取值范围大 的类型,向 取值范围小 的类型 转换,需要 强制类型转换,需要 手动执行
转换格式
数据类型 变量名 = (数据类型)被转数据值;
问题一的解决方法:
public static void main(String[] args) {
long l=123;
int i=(int)l;
System.out.println(i);
System.out.println(l);
}
问题二的解决方法:
将 1.5 赋值到 int 类型,代码修改为:
// double类型数据强制转成int类型,直接去掉小数点。
int i = (int)1.5;
System.out.println(i);
运算时的解决方法:
public static void main(String[] args) {
int i=100;
long l=200;
int x=(int)(i+l);
System.out.println(x);
}
注意
- 浮点转成整数,直接取消小数点,可能造成数据损失精度。
- int 强制转成 short 砍掉2个字节,可能造成数据丢失。
// 定义s为short范围内最大值
short s = 32767;
/*
2是int型,s+2,结果为int型,赋给short型变量s时,会报错
需要强制转换
注意:32769超出short类型的最大值(32767),强转short型,超出最大值,会从最小值开始算
*/
s = (short)(s + 2);
System.out.println(s);
练习
阅读下面程序,分析是否能正确执行
public static void main(String[] args){
byte b1=1;
byte b2=2;
byte b3=1 + 2;
byte b4=b1 + b2;
System.out.println(b3);
System.out.println(b4);
}
分析:
代码
byte b3 = 1 + 2, 1 和 2 是常量,为固定不变的数据,在编译的时候(编译器javac),已经确定了 1+2 的结果并没有超过byte类型的取值范围,可以赋值给变量 b3 ,因此 b3=1 + 2 是正确的。代码
b4 = b2 + b3, b2 和 b3 是变量,变量的值是可能变化的,在编译的时候,编译器javac不确定b2+b3的结果 大小,因此会将结果以int类型进行处理,int类型不能赋值给byte类型,因此编译失败。
提示:
整型一般使用int型,int型的大小,足够表示日常生活中的整数,而且在各类转换中,不易出错
小数一般使用double型