NO.3 长整数
来源:互联网 发布:互穿网络的相分离 编辑:程序博客网 时间:2024/04/29 05:29
Java谜题1:表达式谜题
NO.3 长整数
long类型值整除
public class LongDivision{public static void main(String args[]){final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);}}
打印结果:5
问题在于常数MICROS_PER_DAY 的计算“确实”溢出了。尽管计算的结果适合放入long 中,并且其空间还有富余,但是这个结果并不适合放入int 中。这个计算完全是以int 运算来执行的,并且只有在运算完成之后,其结果才被提升到long,而此时已经太迟了:计算已经溢出了,它返回的是一个小了200 倍的数值。从int提升到long是一种拓宽原始类型转换(widening primitive conversion),它保留了(不正确的)数值。这个值之后被MILLIS_PER_DAY 整除,而MILLIS_PER_DAY 的计算是正确的,因为它适合int 运算。这样整除的结果就得到了5。
那么为什么计算会是以int运算来执行的呢?因为所有乘在一起的因子都是int数值。当你将两个int 数值相乘时,你将得到另一个int 数值。Java 不具有目标确定类型的特性,这是一种语言特性,其含义是指存储结果的变量的类型会影响到计算所使用的类型。
解决方法:通过使用long 常量来替代int 常量作为每一个乘积的第一个因子。
public class LongDivision{public static void main(String args[ ]){final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;final long MILLIS_PER_DAY = 24L * 60 * 60 * 1000;System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);}}
教训:当你在操作很大的数字时,千万要提防溢出。即使用来保存结果的变量已显得足够大,也并不意味着要产生结果的计算具有正确的类型。当你拿不准时,就使用long 运算来执行整个计算。
语言设计者从中可以吸取的教训是:也许降低缄默溢出产生的可能性确实是值得做的一件事。这可以通过对不会产生缄默溢出的运算提供支持来实现。
程序可以抛出一个异常而不是直接溢出,就像Ada 所作的那样,或者它们可以在需要的时候自动地切换到一个更大的内部表示上以防止溢出,就像Lisp 所作的那样。
这两种方式都可能会遭受与其相关的性能方面的损失。
降低缄默溢出的另一种方式是支持目标确定类型,但是这么做会显著地增加类型系统的复杂度。
- NO.3 长整数
- Java解惑1-3长整数
- 无限长整数运算
- 两个长整数相乘
- 长整数生成
- 第七题 长整数
- 长整数赋值问题
- 长整数的乘法
- 数据结构长整数
- 长整数的加减法
- 第七次作业整数划分NO.3
- 有符号长整数 转 无符号长整数
- 长整数的基本操作
- 任意长整数相加源代码
- 长整数的基本操作
- 长整数的基本操作
- 长整数的基本操作
- 长整数的基本操作
- 应对艰难职场环境的五条策略
- utralEdit取消bak文件方法
- 我的androidapp开发框架(一)main包
- 串口程序调试总结
- 马无夜草不肥:程序员做业余项目的重要性
- NO.3 长整数
- 破解linux系统的root密码
- rython学习记录1
- 栈的增长和溢出
- 有关NIOS里用到SDRAM相移的计算
- javaweb(1)
- Keil和Proteus联合仿真配置
- Error #2044: 未处理的 onDocumentLoadedError
- freebsd8.2搭建apache2.2+tomcat6.x+mysql5.5 web服务器,乱码问题