Java之基本数据的类型转换

本文详细介绍了Java中的自动类型提升规则,包括boolean类型的特殊性、数值类型间的转换限制、强制类型转换可能带来的精度损失及其实现原理,以及数学运算时的数据类型自动提升等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自动类型提升

1.boolean不允许进行类型转换

布尔类型boolean占有一个字节,由于其本身的特殊含义,使得与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换),否则将编译出错。
 

2.数值范围小的类型→数值范围大的类型,JVM在编译过程中负责对数值类型进行自动提升

byte a = 1000;   // 编译出错 Type mismatch: cannot convert from int to byte
float b = 1.5; // 编译出错 Type mismatch: cannot convert from double to float
byte c = 3; // 编译正确
【例外】前两句很好理解,但int赋值byte类型编译正确是因为:

int→(byte/char/short)的类型转换在一定条件下不需强制转换

JVM 在编译过程中,默认为int类型的数值赋值给一个比int型数值范围小的数值类型变量(在此统一称为数值类型k,k可以是byte/char/short类型)会进行判断,若此int型数值超过k的范围,则会直接编译出错。但若此int型数值尚在数值类型k范围内,jvm会自定进行一次隐式类型转换,将此int型数值转换成类型k。
 

3.byte→char,char→short不进行自动类型提升

由于数值范围的原因,使得byte、short与char之间无法进行类型转换,但byte可以提升至short类型。
 

4.数据的默认类型

Java中,整数类型(byte/short/int/long)对于未声明数据类型的整形默认为int 类型 ;浮点类型(float/double)默认为double类型。
long a = 10000000000; //编译出错: The literal 10000000000 of type int is out of range 
10000000000默认数据类型是int,而int的数值范围是-2^31 ~ 2^31-1,显然超出范围,所以编译报错,这里只需要申明自生默认类型即可。-----long a = 10000000000L; //编译正确
 
 

数值类型的强制转换

1.强制类型转换一数值类型转换至范围更低,可能会丢失精度

byte p = 3; // 编译正确:int到byte编译过程中发生隐式类型转换
int a = 3;
byte b = a; // 编译出错:cannot convert from int to byte
byte c = (byte) a; // 编译正确
float d = (float) 4.0;
分析:b=a编译报错是因为 a是变量,编译期无法确定。
 

2.强制类型转换的原理分析

int a = 233;
byte b = (byte) a;
System.out.println("b:" + b); // 输出:-23
分析:233的二进制表示为:24位0+11101001,byte只有8位, 从高位开始舍弃得到:11101001,由于最高位为符号位,1表示负数,其相应数值表示为-23。
 
 

3.进行数学运算时,数据类型会自动提升到运算符左右之较大者

byte e = 10, f = 11;
byte g = e + f; // 编译错误 +直接将10和11类型提升为了int
byte h = (byte) (e + f); //编译正确
 
关于强转丢失精度的相关底层原理可查看 Java之&0xff用法解析以及原码、反码、补码相关知识
 
 

 





转载于:https://www.cnblogs.com/linux007/p/5782712.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值