gpt4 book ai didi

来自 millis 的 Java Date - long 与 int

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:35:45 24 4
gpt4 key购买 nike

对于下面的代码:

import java.text.SimpleDateFormat;
import java.util.Date;

public class TestMain {

public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
System.out.println(sdf.format(new Date(1386633600000L)));
System.out.println(sdf.format(new Date(1386633600 * 1000)));
}

}

我得到以下输出:

10-12-2013
24-12-1969

它们为什么不同?

最佳答案

因为第二个值使用的是 integer 而不是 long 并且已经溢出。

如果您在任一常量的末尾添加一个 L,它将切换为使用 long 值,并且差异将消失。

这是因为在第二个示例中,两个值都是整数。整数 * 整数 = 整数。只有当一个或多个值相乘(或与此相关的任何其他数学运算)为长整数时,它才会被提升为长整数。没有检测到溢出并为您进行促销的“魔术”。

即使您执行了 long x = int*int,它仍然会执行 32 位乘法,然后将结果转换为 64 位以进行赋值。

您也可以在更细微的地方看到这一点 - 例如:

long l;
int x,y;

long result = l+x*y;

即使 result 和 l 都是长整数,x*y 仍然作为整数完成,因为乘法是先完成的。即使 x 和 y 分别适合 32 位整数,如果两者的乘积不符合,您也会遇到溢出情况。解决方法是确保在您遇到溢出风险的最早时刻将其转换为 long - 例如:

long result = l+((long)x)*y;

关于来自 millis 的 Java Date - long 与 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20495653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com