Java长整形


话说有这样一个小例子:
MICROS_PER_DAY表示一天的微秒数
MILLIS_PER_DAY表示一天的毫秒数
然后下面例子的结果是多少呢?

1 public class Test3 {
2     public static void main(String[] args) {
3         final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
4         final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
5         System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
6     }
7 }

So easy
数据类型为 long ,很容易保存这两个乘积不产生溢出.
因此,结果肯定是 1000!

but….. 结果是:数据溢出!!!

但是但是long能表示 -2的63次方到2的63次方-1的整数.
数都数不过来,怎么会溢出?
小心陷阱啊,虽然我们定义的是long类型,
准确的说最终的结果应该是long类型的.

我们看看表达式右边,
24 * 60 * 60 * 1000 * 1000
这个表达式是以int类型作为运算的,
intint类型相乘,结果还是int类型,
最终结果超过int所能保存的范围,所以数据溢出了,
然后才被long所保存;

改进
 

24 * 60 * 60 * 1000 * 1000–>24L * 60 * 60 * 1000 * 1000

 


在表达式随便哪个数值后面加上一个l或者L就搞定了,
其结果会自动转换为long而不是int了,然后再保存到long类型变量中.

很简单

 

 

原文地址:http://blog.csdn.net/CodeAi/article/details/46704777?locationNum=8&fps=1


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM