主要内容:
- 理解数据类型的自动转换
- 理解数据类型的强制转换
- 掌握数据类型转换的特殊情况
Java程序要求参与计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。
1 自动转换
1.1 不同取值范围类型的两个变量
不同取值范围类型的两个变量相加,会将取值范围小的类型自动提升为取值范围大的类型。
如一个 int 类型变量和一个 byte 类型变量进行加法运算,结果是 int 类型,这就出现了数据类型的自动类型转换现象:
public static void main(String[] args) {
int i = 1;
byte b = 2;
// byte x = b + i; // 报错
int j = b + i;// int类型和byte类型运算,结果是int类型
System.out.println(j);
}
byte 类型内存占有1个字节,在和 int 类型运算时会提升为 int 类型,自动补充3个字节,因此计算后的结果还是 int 类型。

同样道理,当一个 int 类型变量和一个 double 类型变量运算时,int 类型将会自动提升为 double 类型进行运算。
public static void main(String[] args) {
int i = 1;
double d = 2.5;
// int类型和double类型运算,int类型会提升为double类型,结果是double类型
double e = d + i;
System.out.println(e);
}
转换规则:范围小的类型向范围大的类型提升,byte 、short 、char 运算时直接提升为 int 。
byte、short、char → int → long → float → double 。
1.2 两个byte、short、char类型变量相加
-
两个
byte类型变量相加:结果会转换为int类型。public static void main(String[] args) { byte b1 = 3, b2 = 4, b; b = b1 + b2;// 报错:结果为int类型,将int直接赋值为byte是有损的数据转换 b = 3 + 4;// 3+4是常量的计算,会优先执行,执行结果再赋值给byte,此时判断数值是否满足该类型范围,满足就直接赋值 System.out.println(b); } -
两个
short类型变量相加:结果会转换为int类型。public static void main(String[] args) { short s1 = 3, s2 = 4, s; s = s1 + s2;// 报错:结果为int类型,将int直接赋值为short是有损的数据转换 s = 3 + 4;// 3+4是常量的计算,会优先执行,执行结果再赋值给short,此时判断数值是否满足该类型范围,满足就直接赋值 System.out.println(s); } -
两个
char类型变量相加:结果会将二者对应的ASCII编码对照的数值相加,转换为int类型。public static void main(String[] args) { char c1 = 'A', c2 = 'a', c; c = c1 + c2;// 报错:结果为int类型,将int直接赋值为char是有损的数据转换 int a = c1 + c2;// 65+97=162 System.out.println(a); }
2 强制转换
2.1 概念
强制类型转换:将取值范围大的类型强制转换成取值范围小的类型。
如将 1.5 赋值到 int 类型变量会产生编译失败,肯定无法赋值:
int i = 1.5; // 错误
double 类型内存8个字节,int 类型内存4个字节。1.5 是 double 类型,取值范围大于 int 。
可以理解为
double是8升的水壶,int是4升的水壶,不能把大水壶中的水直接放进小水壶去。
想要赋值成功,只有通过强制类型转换,将 double 类型强制转换成 int 类型才能赋值。
比较而言,自动转换是Java自动执行的,而强制转换需要我们自己手动执行。
2.2 转换格式
数据类型 变量名 = (数据类型) 被转数据值;
如将 1.5 赋值到 int 类型,代码修改为:
// double类型数据强制转成int类型,直接去掉小数点。
int i = (int)1.5;// i=1
同理,当一个 short 类型与 1 相加,short 类型会被提升为 int 类型。
short 占2个字节,int 占4个字节,若仍要将结果赋值给 short 类型变量,就需要强制转换,否则会报有损转换的错误。
public static void main(String[] args) {
short s = 1;// short类型变量,内存占2个字节
s = s + 1;// 编译失败
s = (short)(s + 1);// 编译成功
}

2.3 强制转换或造成数据丢失
-
浮点转成整数,直接取消小数点,可能造成数据损失精度。
-
int强制转成short砍掉2个字节,可能造成数据丢失。// 定义s为short范围内最大值 short s = 32767; // 运算后,强制转换,砍掉2个字节后会出现不确定的结果 s = (short)(s + 10);// -32759

3 数据类型转换的特殊情况【掌握】
3.1 += 符号的扩展
下面的程序有问题吗?
public static void main(String[] args){
short s = 1;
s += 1;
System.out.println(s);
}
s += 1 逻辑上看作是 s = s + 1 ,计算结果被提升为 int 类型,再向 short 类型赋值时发生错误,因为不能将取值范围大的类型赋值到取值范围小的类型。
但是,s = s + 1 进行两次运算,+= 是一个运算符,只运算一次,并带有强制转换的特点,也就是说 s += 1 就是 s = (short)(s + 1) ,因此程序没有问题,运行结果是 2 。
本文详细介绍了Java中数据类型的自动转换和强制转换。在自动转换中,取值范围小的类型会提升为大的类型,例如byte到int。而对于byte、short、char之间的相加,会有特定的转换规则。强制转换则需要程序员手动执行,但可能导致数据丢失或精度下降。文章还特别讨论了数据类型转换的特殊情况,如符号扩展,并通过示例解释了其工作原理。
4916

被折叠的 条评论
为什么被折叠?



