设为首页 加入收藏

TOP

Java基础——隐式转换vs强制转换
2015-02-25 22:44:04 来源: 作者: 【 】 浏览:60
Tags:Java 基础 转换 强制

在定义变量时,有许多要注意的问题,一不小心就会出现损失精度或者不兼容类型等问题。


例如:


? ? 1.定义长整型数据时,必须加后缀lL


? ? ? ? ? ? ? long l =123456789012345L


? ? 2.定义单精度类型时(7-8位有效数字),必须加后缀 f F


? ? ? ? ? ? ? float f = 12.5F


? ? ? ? ? 3. boolean类型不可以转换为其它的数据类型。


?


这其中,我们常常会遇到数据类型的转换问题,最为常见的要属隐式转换和强制转换了,我们来分析一下。


?


从小到大,可以隐式转换,数据类型将自动提升。


byteshortchar -->int? -->long -->float -->double


注意:long8个字节,float4个字节。


long是整数,float是浮点型,整数和浮点数的存储规则不一样,记住一点long的范围是小于float的。


:


byte a=10;


int b=a;


当编译intb=a 时,? a隐式转换为int类型。


? ? ?从大到小(如果你明确知道数据是可以用该数据类型来表示的,可以用强制转换)


? ? (转换后的数据类型)变量或者值。


注:一般情况下,根本不推荐使用强制类型转换。


? ? ? ? ? ?例1 :


int a=10;


byte b=(byte)a;


当编译 byte b=(byte)a时, a被强制转换为byte类型。


例2:


?class QiangZhiDemo
?{
? public static void main(String[] args)
? {
? ?byte b=(byte)130;
? ?System.out.println(b);?//打印结果-126
? }?
?}


解析:


数据130默认的是int类型的十进制数据,


第一步:十进制130转换成二进制数据。


? 10000010


第二步:130在内存中的表示形式如下


原码:0000000000000000 00000000 10000010


第三步:求int130的补码


因为130是正数,所以,反码和补码都和原码一致。


补码:0000000000000000 00000000 10000010


第四步:对补码进行截取,只剩下最后8位。


(byte)130?的补码为:10000010


第五步:把该补码转化为原码。


由于符号位(第一位)是1,故该数为负数,


反码:10000001? ? (补码-1)


原码:11111110? ? (符号位不变,数据位取反)


转化为十进制为 -126,所以最终打印-126


? ? ?3 :


shorts = 1;


s= s +1;? ? ? ? ? ? ? ?



shorts = 1;


s+=1;? ? ? ? ? ? ? ? ? ? ? ?


有问题吗?为什么呢?


?


? ? ?解析


第一程序会报错:错误:不兼容的类型:从int转换到short可能会有损失


? ? ? ? ?Java基础——隐式转换vs强制转换?


原因:s=s+1;s+1会隐式转换为int类型,当把一个int类型赋值给short类型是,可能会损失。


第二个程序可以编译运行。


? ? ? ? ?


原因:s+=1,虽然可以看做s=s+1,但是还是有区别的,s+=1中有一个强制转换,s=(short)(s+1),会把s+1的值强制转换为short类型,故不会报错。


数据类型转换的问题如果发生在一些小程序上,我们或许能够一眼看出,可是当编写一个庞大的系统时,拥有庞大数据量时,这些小小的问题可能导致系统出错甚至崩溃,所以前期代码编写的严谨性就得靠我们自己把握了。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇如何用方程式写春联 下一篇Java基础——成员变量、局部变量..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: