JR 精品文章 - 你知道什么是缄默溢出吗
AD: jr (at) javaresearch.org


首页 | 动态 | 文章 | FAQ  | 新闻 | 下载 | 代码 | 工作 | 调查 | 术语 | 站点 | 图书 | 论坛 | 帮助 | 全部  

TOP | 交流 | 软件 | 专栏 | 开源 | 译/著 | 源码 | API  | 推荐 | FTP  | 积分 | 统计 | 搜索 | Blog | 我们  
首页 » 研究文集 » J2SE综合 搜索标题相关文章 搜索标题相关文章    评论此文章 发表评论     开始监控此文章 开始监控   加入收藏夹  加入收藏夹
你知道什么是缄默溢出吗
deadspace 原创   更新:2007-03-01 09:14:18  版本: 1.0   

一、案例编号:

U02C05

二、案例名称:

你知道什么是缄默溢出吗?

三、关键词:

缄默溢出

四、案例情景描述:

我们来做这么一件事情:我们求一下一天当中有多少纳秒(ns)。这个问题逻辑上很简单,我想这段代码你肯定是信手拈来。

/*
*一天24小时,每小时60分钟,每分钟60秒,每秒1000毫秒,每毫秒1000纳秒
*/
long micro_seconds_per_day=1*24*60*60*1000*1000;
System.out.println(micro_seconds_per_day);

但是当你运行这段代码看到输出结果的时候肯定会大吃一惊。它结果是:500654080。单单从最低位0的个数看,我们就知道这个结果肯定是错误的。

奇怪!为什么会错!逻辑没有问题,计算机对于这种简单的乘法运算也不应当出错。而且这段代码无论你运行多少次都是这个结果,看来不会是计算机的问题。

五、案例理论分析:

罪魁祸首就是这一行代码:long micro_seconds_per_day=1*24*60*60*1000*1000;我们来分析一下它:

整型的字面值默认为int类型。上述代码在运算的时候是进行的int类型的运算,运算过程中产生的一切中间结果都要保存在int类型的空间中。运算结束后再把运算结果转换成long类型并赋值给变量micro_seconds_per_day。

这个表达式1*24*60*60*1000*1000的运算结果用8个byte的二进制数来表示是:00000000,00000000,00000000,00010100,00011101,11010111,01100000,00000000。对于4个byte的int类型而言肯定是溢出了,因此要进行类型缩窄转换。类型缩窄砍掉了高位的4个字节变成00011101,11010111,01100000,00000000,转换成十进制就是500654080。而这次类型缩窄转换完全是程序在运行过程中自动完成的,程序员是毫不知情的。因此,才会出现令人瞠目结舌的结果。对于这种现象我们就称之为“缄默溢出”。造成“缄默溢出”的本质原因不是程序员的问题,而是语言设计者的问题。但是作为程序员在语言的应用过程中,要规避这种现象。那如何规避呢?很简单只要让表达式不进行int类型的运算,而进行long类型的运算即可。修改很简单:
long micro_seconds_per_day=1*24*60*60*1000*1000L;

版权声明   给作者写信
本篇文章对您是否有帮助?  投票:         投票结果:     18       1
作者其它文章: 作者全部文章
评论人:Sunny2003 发表时间: Thu Mar 01 12:57:13 CST 2007
好贴
评论人:Sunny2003 发表时间: Thu Mar 01 12:59:09 CST 2007
好贴!!!!
评论人:masterkey 发表时间: Fri Mar 02 11:27:11 CST 2007
小儿科
评论人:chuangzhou2006 发表时间: Fri Mar 02 22:15:33 CST 2007
强强!!!
评论人:ttface 发表时间: Wed Mar 07 22:51:12 CST 2007
这个益出的说明好肤浅的说~~~
评论人:jiandingak47 发表时间: Thu Apr 12 13:29:29 CST 2007
顶一下

这个文章共有 6 条评论
主题: 使用条件运算符的阵痛 上一篇文章
返回文章列表 返回〔J2SE综合〕
下一篇文章 主题: Apache Struts 2 GA 版本发布(学struts的一定要看!)


文字广告链接
        自主、快速定制基于JAVA的B/S业务系统          重量级企业在线自定义WEB报表平台
        Excel制表、零代码发布、打印、图表结合——快逸报表,免费、稳定、功能强大的java工具
        技术圈: 关于Java、dotNet、PHP、Ruby、奇客、Web2.0等更多资讯博客精选文章

关于 JR  |  版权声明  |  联系我们 

©2002-2006 JR 版权所有 沪ICP备05019622号