谜题3:Long Division 长整除
2017-08-02 23:31
176 查看
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); } }
看起来两个变量都是long类型,大小足够盛的下数值,没有理由溢出,应该输出1000。
结果却输出5,确实溢出了。
存在的问题:不是右边数值保存到long变量中溢出了,而是右边表达式在计算时已经溢出了,因为右边表达式中的数值类型都是int,因此都是int类型之间的计算,导致溢出。计算完毕之后,将溢出的结果赋值给左侧long变量,才发生拓宽原生类型转换(widening primitive conversion)。
解决方法:在等号右边的表达式的第一个值改写为long类型,这样可以强制表达式中的所有后续计算都用long运算来完成:
final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000
相关文章推荐
- 长整除谜题
- 谜题3:长整除
- java谜题3:长整除
- Java Puzzlers笔记--Puzzle 3: Long Division 溢出问题
- 《Java解惑》系列——01表达式之谜——谜题03:长整除
- 2010 TCO Algorithm Online Round 5 - Division I, Level Two LongJourney
- java解惑--谜题3:长整除
- lightoj 1214 - Large Division 【判大数整除 拆分字符串 同余】
- 表达式谜题之4long类型数据最好用大写L防止和数字混淆
- C/C++中各种类型int、long、double、char表示范围(最大最小值)
- 笔记-js将long日期格式转换为标准日期格式
- 求两个数的整除余数
- 微信小程序-双击长按触发longtap事件时同时触发tap事件解决办法
- long long,_int64使用小结
- ZCMU-1755-数字整除
- "CreateProcess error=206, The filename or extension is too long"的一个解决方案
- long类型需要注意
- CreateThread 函数常见错误 cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long...
- getopt与getopt_long
- 南阳理工:整除个数