以下代码:
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
他们为什么不同?
答案 0 :(得分:15)
因为第二个值使用的是integer
而不是long
并且已经溢出。
如果在任一常量的末尾添加L,它会将其切换为使用long
值,差异将消失。
这是因为在第二个例子中,两个值都是整数。 int * int = int。如果一个或多个值乘以(或任何其他数学运算)很长,它只会被提升为long。没有“魔法”可以检测到溢出并为您进行促销。
即使您执行了long x = int*int
,它仍将以32位进行乘法运算,然后将结果转换为64位进行赋值。
您也可以在更微妙的地方看到这一点 - 例如:
long l;
int x,y;
long result = l+x*y;
即使结果和l都很长,x * y仍然以整数形式完成,因为乘法是先完成的。即使x和y分别适合32位整数,如果两者的乘积不存在溢出情况。修复方法是确保在遇到溢出风险的最早点将其转换为long - 例如:
long result = l+((long)x)*y;