七、数据类型转换

本文详细介绍了Java中数据类型的自动转换和强制转换。在自动转换中,取值范围小的类型会提升为大的类型,例如byte到int。而对于byte、short、char之间的相加,会有特定的转换规则。强制转换则需要程序员手动执行,但可能导致数据丢失或精度下降。文章还特别讨论了数据类型转换的特殊情况,如符号扩展,并通过示例解释了其工作原理。

主要内容:

  • 理解数据类型的自动转换
  • 理解数据类型的强制转换
  • 掌握数据类型转换的特殊情况

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);
}

转换规则:范围小的类型向范围大的类型提升,byteshortchar 运算时直接提升为 int
byte、short、charintlongfloatdouble

1.2 两个byte、short、char类型变量相加

  1. 两个 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);
    }
    
  2. 两个 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);
    }
    
  3. 两个 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.5double 类型,取值范围大于 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 强制转换或造成数据丢失

  1. 浮点转成整数,直接取消小数点,可能造成数据损失精度。

  2. 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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值