首页下载分类最新更新汉化补丁下载排行国产软件国外软件注册破解资讯中心游戏娱乐
78软件站 - 首页
文章搜索: 分类 关键字
您的位置:首页网络编程 → 达内金牌讲师唐亮Java语言细节(下)
达内金牌讲师唐亮Java语言细节(下)
日期:2008-1-6 10:45:56 人气:0     [ ]
8,拓宽数值类型会造成精度丢失吗?
Java语言的8种基本数据类型中7种都可以看作是数值类型,我们知道对于数值类型的转换有一个规律:从窄范围转化成宽范围能够自动类型转换,反之则必须强制转换。请看下图:P=I85C
byte-->short-->int-->long-->float-->double%<
char-->int"G
我们把顺箭头方向的转化叫做拓宽类型,逆箭头方向的转化叫做窄化类型。一般我们认为因为顺箭头方向的转化不会有数据和精度的丢失,所以Java语言答应自动转化,而逆箭头方向的转化可能会造成数据和精度的丢失,所以Java语言要求程序员在程序中明确这种转化,也就是强制转换。那么拓宽类型就一定不会造成数据和精度丢失吗?请看下面代码:hc/N@
int i=2000000000;n
int num=0;?H=
for(float f=i;f num++;.}Q}1
}&copy;达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ^n{P]W
System.out.println(num);=u
请考察以上代码输出多少?C/q+
假如你回答50 ,那么请运行一下,结果会让你大吃一惊!没错,输出结果是0,难道这个循环根本就没有执行哪怕一次?确实如此,假如你还不死心,我带你你看一个更诧异的现象,运行以下代码,看输出什么?~
int i=2000000000;9
float f1=i;yW
float f2=i+50;g
System.out.println(f1==f2);d
哈哈,你快要不相信你的眼睛了,结果竟然是true;难道f1和f2是相等的吗?是的,就是这样,这也就能解释为什么上一段代码输出的结果是0,而不是50了。那为什么会这样呢?要害原因在于你将int值自动提升为float时发生了数据精度的丢失,i的初始值是2000000000,这个值非常接近Integer.MAX_value,因此需要用31位来精确表示,而float只能提供24位数据的精度(另外8位是存储位权,见IEEE745浮点数存储规则)。所以在这种自动转化的过程中,系统会将31位数据的前24位保留下来,而舍弃掉最右边的7位,所以不管是2000000000还是2000000050,舍弃掉最右边7位后得到的值是一样的。这就是为什么f1==f2的原因了。IwY'q
类似的这种数值拓宽类型的过程中会造成精度丢失的还有两种情况,那就是long转化成float和long转化成double,所以在使用的时候一定要小心。

9,i=i+1和i+=1完全等价吗?
可能有很多程序员认为i+=1只是i=i+1的简写方式,其实不然,它们一个使用简单赋值运算,一个使用复合赋值运算,而简单赋值运算和复合赋值运算的最大差别就在于:复合赋值运算符会自动地将运算结果转型为其左操作数的类型。看看以下的两种写法,你就知道它们的差别在哪儿了:1wa
(1) byte i=5;Zvt^o
i+=1;`d.
(2) byte i=5;F1p
i=i+1;J&
第一种写法编译没问题,而第二种写法却编译通不过。原因就在于,当使用复合赋值运算符进行操作时,即使右边算出的结果是int类型,系统也会将其值转化为左边的byte类型,而使用简单赋值运算时没有这样的优待,系统会认为将i+1的值赋给i是将int类型赋给byte,所以要求强制转换。理解了这一点后,我们再来看一个例子:@4DiYK
byte b=120;e-\
b+=20;6(dTP
System.out.println("b="+b);+e6_+
说到这里你应该明白了,上例中输出b的值不是140,而是-116。因为120+20的值已经超出了一个byte表示的范围,而当我们使用复合赋值运算时系统会自动作类型的转化,将140强转成byte,所以得到是-116。由此可见,在使用复合赋值运算符时还得小心,因为这种类型转换是在不知不觉中进行的,所以得到的结果就有可能和你的预想不一样。
出处:78软件收集整理 作者:不详
评论人 评论内容摘要(共 0 条,查看完整内容) 得分 0 发表时间
 热点文章
·Windows XP中快速转换FAT32至NTFS
·Windows 98全方位优化
·直接用WIN2000自带的NAT的实现端口映射的方法
·Ghost 2003成功克隆Windows XP
·全面提速Windows XP
·Windows XP优化技巧
·windows XP 系统服务“关闭”详细列表,释放N多内..
·Windows XP关机技巧二则
·Adobe Photoshop 鲜为人知的75个技巧[酷]
·给Windows XP减减肥
 推荐文章
·用好你的Windows安全模式
·想慢都不行:WinXP急速启动最新技巧
·各种ADSL路由设置
·解决 Windows XP_SP2 验证码无法显示的补丁!
·Windows Server 2003在线更新的补丁!
78软件站 版权所有 Copyright© 2003-2008 Www.78soft.COM, All Rights Reserved. Powered By 78软件站 鄂ICP备05000648号