Java基本数据类型转换
在普通的jvm中,各个类型所占内存如下,可以看到从 byte,char,short 直到double型,所占字节数依次增大。这个字节数,我们不同机器可能会不同,要想实现也比较简单,如查看 int 型数据类型占用的字节数,
int len = Integer. SIZE / 8; // 获取字节数
----------
这里我要啰嗦2点,
- 我认为的类型提升,指的是小转大,eg. double d = 15 ; 这个是系统自动完成的。我认为的类型降低,指的是小转大, eg. int i = (int)3.14;这个需要强制类型转换。
- 有人会问,为什么 int 和 float 都是4字节,按理说都应该是 -2^31 ~ 2^31-1 ,为什么float 表达的范围这么宽呢,其实这个问题,应该读读计算机组成原理,float 型的存储方式,float 型并不是所有位数都拿来存储二进制数的,具体的方式:1位符号位,8位指数位,23位尾数位,这样一来,表达的范围就更大,但是带了的坏处是,进度减少了。
----------
那么我们的问题来了,我们有如下3条语句
float f = 1.5 ; // 编译报错
byte b1 = 512 ; // 编译报错
byte b2 = 3 ; // 编译通过
首先第一条,1.5 java 默认是双精度型,但是声明变量 f 是浮点型,由大转小,需要强制转换,因此报错。但是第二,第三条语句中,乍一看左边都是整型(512, 3),但声明的是byte型变量,由大转小,但为什么b1 = 512 可以,但是 b2 = 3 却不可以呢?
隐式类型转换,将此int型数值转换成类型k。如图中的虚线箭头。这一点有点特别,需要稍微注意下。
但是问题又来了,我在eclipse中输入下面的语句,
int i = 3;
// 编译报错
//编译通过
你可能会问,这不是有java隐式转换机制吗,那么3可以转换为byte型啊? But,请看第一句,int i = 3;这一句话,声明了i变量是int型,你再赋值给 byte 型,就会出现 大转小的错误,此时应该需要强制类型转换,如第三句一样。
接着我们看下面2条语句
// 编译错误
// 编译通过
100000000 赋值给一个浮点型变量 f1,但是 100000000 已经超过 int 型数据类型可表示的范围了,所以这里就错了。 第二句给 100000000后面加上L,表示是 浮点型,赋值给
f2,编译通过。
---------------
【参考网址】
http://www.360doc.com/content/10/0915/10/2795334_53771845.shtml java数据类型转换