您的位置:首页 > 编程语言 > Java开发

java基本类型转换

2015-05-22 21:49 295 查看
一. 隐式转换

java中的基本数据类型有8种,他们是boolean,byte,char,short,int,long,float,double.其中boolean比较特殊,他不参与隐式转换。所以我们只讨论剩下的7种,下面根据他们的自动转换从左到右排序:

byte(8)->char(16)->short(16)->int(32)->long(64)->float(32)->double(64)

按照箭头的方向,大部分情况下,隐式转换自动执行,但是有几种特殊情况,下面就来讲这几种特殊的规则,不需要特别的记忆,只要把原理看懂,会发现所谓的特殊也是有规律可循的。

1. int的特殊性:在某些情况下他可以逆向隐式转化为byte,char,short。

下面先看一个例子:

byte b = 3;
char c = 4;
short sh = 5;
byte b2 = 128;//error
int i = 3;
byte b3 = i;//error

jvm在编译的时候遇到int直接赋值给byte,char,short,会自动的检测数值是否在被赋值类型的表示范围之内,比如第一个:byte b = 3;byte所占位数是8,因此他的范围是从-2^7~2^7-1,3在这个范围内,所以jvm会自动的将3转换为byte类型,第二行和第三行也是一样的道理;而第四行的b2 = 128超过了byte所能表示的范围,因为毕竟是隐式转换,既然是隐式,没有直接告诉编译器要怎么做,编译器当然不能理所当然的把数值给截掉一部分来赋值了,因此报错。而最后一行:byte
b3 = i为什么会报错呢?因为,这里的i是变量,编译器不知道i是多少,这和直接赋值为3是不一样的,因此编译器不确定这里的i到底会不会超过byte的表示范围,因此报错。

2.char可以隐式转化为byte

只要不超过char的表示范围,同样可以隐式转换,如:

byte b = '3';


3.byte不能隐式转化为char

byte b = '3';
char c = b;//error


在这7种基本类型中,只有char是无符号的,也就是他的表示范围是0~2^16-1,没有负数,因此从byte到char是不安全的。

4.char到short

char隐式转化为short要看具体的情况,如果char的数值在short的表示范围之内,则不会报错,如果超过,就会报错,比如直接把short复制为一个复杂的汉字“齉”,就会报错,因为超过边界。

5.byte可以直接转化为short

虽然byte到char,char到short都困难重重,但是byte到short是没有压力的,因为short的表示范围完全可以包含byte。

上述几种特殊情况其实都是围绕着“表示范围”进行的,编译器可以帮我们检查范围是否超过该类型的表达能力,如果没有超过,则可以隐式转换,另外再注意一下直接赋值为一个变量,编译器是不能判断这个变量是否超过边界的,除非是像byte到short这种,byte无论怎样取值都不会超过short的边界,这样是可以用变量赋值的,就像这样:

byte b = '3';
short ss = b;

二.强制转换

java的强制转换就是这七个类型的从右向左的逆向过程,由于表达的范围各有不同,因此伴随着强制转化的往往是精度的损失,比如从double转化为int:

double d = 3.9;
int i = (int)d;这里的i为3,而不是4,因为double强制转化为int的时候采用的是直接截掉小数点后面的位数,留下整数。
另外,如果范围超出,则截取二进制低位进行保留,举个例子,从int转化为byte:int i = 1234;
byte b = (byte)i;这里的b是-46,我们一步一步分析,1234已经超过了byte类型的表示范围,因此进行截取,1234的二进制表示为10011010010,byte占8位,因此从右往左截取8位:11010010,其中第一位表示正负,这里是1,表示负数,因此对剩余的7位取补码:0101110=46,最终结果为-46。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息