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。
下面先看一个例子:
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的表示范围,同样可以隐式转换,如:
3.byte不能隐式转化为char
在这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的边界,这样是可以用变量赋值的,就像这样:
二.强制转换
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。
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。
相关文章推荐
- java与.net比较学习系列(3) 基本数据类型和类型转换
- 学习java(一:从Java设计思想看基本数据类型与类型转换)
- Java基本类型与byte数组之间相互转换
- Java基本数据类型转换那些事
- Java基础小知识——基本数据类型和字符串以及字节数组的转换
- java中基本数据类型转换
- Java之基本数据类型及类型转换
- Java 中基本类型和字符串之间的转换
- JAVA基本数据类型之间的转换
- java基本数据类型之间的转换
- Java基本类型转换总结
- JAVA 基本数据的类型转换
- Java基本类型转换(Primitive Data Type Casting) int/byte & char
- java基本数据类型相互转换
- 【java基础】在Java中实现基本数据类型与字符、字符串之间的转换
- JAVA基本数据类型转换
- JAVA基本数据类型转换 .
- 【慕课笔记】第三章 JAVA中必须了解的常用类 第3节 JAVA中基本类型和字符串之间的转换
- JAVA 基本类型和字符串之间的转换
- Java中基本类型Array与复合类型List的互相转换