Java解惑之长整型

谜题3-长整型

标签(空格分隔): Java解惑


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

public class Test3 {
    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);
    }
}

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

but…..
结果是:
此处输入图片的描述

解释:
为什么答案与我们想象不一样呢?
因为数据溢出了…
你在逗我? 但我没学过java?
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类型变量中.
就是这么简单,就是这么任性.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值