码迷,mamicode.com
首页 > 编程语言 > 详细

Java之基本数据的类型转换

时间:2016-08-18 09:55:51      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:

自动类型提升

技术分享

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用法解析以及原码、反码、补码相关知识
 
 

 





Java之基本数据的类型转换

标签:

原文地址:http://www.cnblogs.com/linux007/p/5782712.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!