Java踩坑笔记——long型数据减去一个整数,数字后面加l和不加l结果出现了完全不同的情况

代码:

    public static void main(String[] args) {
        numberNoLSuffixCal();
        numberHasLSuffixCal();
    }

    private static void numberHasLSuffixCal() {
        long maxStamp = System.currentTimeMillis();
        long minStamp = maxStamp - 30 * 86400 * 1000l;//两个方法中有区别的地方

        System.out.println("num has l suffix output==>max:" + maxStamp);
        System.out.println("num has l suffix output==>min:" + minStamp);
    }

    private static void numberNoLSuffixCal() {
        long maxStamp = System.currentTimeMillis();
        long minStamp = maxStamp - 30 * 86400 * 1000;//两个方法中有区别的地方

        System.out.println("num no l suffix output==>max:" + maxStamp);
        System.out.println("num no l suffix output==>min:" + minStamp);
    }

输出:

重点观察:

“no l”的输出中min的值居然大于max的值min明明是用max-30天的毫秒数,怎么可能算下来还大了呢?

“has l”的输出中符合预期,正常的两个长整型数字相减的结果。

原因分析:

numberNoLSuffixCal()方法中,如果minStamp的值大于maxStamp,这通常是由于计算过程中发生了整数溢出。在Java中,long类型的取值范围是-9,223,372,036,854,775,8089,223,372,036,854,775,807。如果计算的结果超出了这个范围,就会发生溢出,导致数值变得非常大或者非常小。

numberNoLSuffixCal()方法中,minStamp是通过maxStamp - 30 * 86400 * 1000计算得出的。这里的30 * 86400 * 1000是一个int类型的表达式,其值超过了int类型的最大值2,147,483,647。因此,在运算时,这个表达式的结果会溢出,并且得到一个错误的int类型的值。随后,这个错误的int类型的值会被隐式地转换为long类型,并与maxStamp进行减法运算。由于这个错误的int值实际上是一个负数(因为溢出),所以最终的minStamp值会异常地大,甚至可能大于maxStamp

记录一下吧,这个问题相信小伙伴们很容易忽略~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值