java大的数变成负数_int类型过大变成负数

本文解析了一个日期工具类中的Bug,该工具类用于计算给定日期之后的特定天数。由于int类型的溢出问题,导致计算出的日期反而倒退。文章详细解释了计算机存储系统中补码的概念,并给出了正确的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机存储系统使用补码标识,int类型占32位,首位是符号位:0表示正数,1表示负数。

正数补码与原码相同

负数补码除符号位其余各位与原码取反,然后加1

最近工作看到一个之前的人写的日期工具类,本来想用Apache的commons包的DateUtils工具类,但是没有找到想要的方法,转而求其次使用封装的工具类,结果遇到一个问题。

需求:给定一个Date对象,找到特定天数后的日期时间

工具类的方法代码是这样写的:

public static Date datetimeAddDay(Date datetime, int day) {

datetime.setTime(datetime.getTime() + day * 24 * 60 * 60 * 1000);

return datetime;

}

猛的一看,并没有什么不对,结果运行时日期不对,写个测试类跑了一下,大吃一惊!!!

@Test

public void testDatetimeAddDay() {

Date datetime = new Date();

System.out.println("当前时间:" + datetime);

Date datetimeAddDay = DateUtil.datetimeAddDay(datetime, 30);

System.out.println("30天后:" + datetimeAddDay);

}

运行结果:

9e81dd6ca1cf1afda3f7db359963bf43.png

这时间还给我倒回去了,原来是工具类的方法加的毫秒数超过int类型最大值了 2的31次方-1,符号位成了1,整体变为负数。所以工具类中运算的毫秒数使用long类型即可!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值