为什么COOKIE_TIMEOUT = 1000*60*60*24*30为负?

Tum*_*Tum 2 java long-integer

final long COOKIE_TIMEOUT = 1000 * 60 * 60 * 24 * 30;
Run Code Online (Sandbox Code Playgroud)

输出:-1702967296

有人告诉我在1000之后放L并且它有效

final long COOKIE_TIMEOUT = 1000L * 60 * 60 * 24 * 30;
Run Code Online (Sandbox Code Playgroud)

输出:2592000000

为什么会这样?

nab*_*lex 6

整数溢出,放1000L,这将迫使长时间转换

更新 稍长一点的解释:

例如,如果你只做1000*10,java会将它们视为整数.在原始代码中,您正在进行溢出的整数计算,然后将溢出的值转换为long.

但是如果你把L放在第一个数字之后,java会把它们视为long(最左边的操作数定义粒度),你不会得到溢出.

另一个例子是这个代码:

double a = 5 / 2;
double b = 5d / 2;

System.out.println(a + " != " + b);
Run Code Online (Sandbox Code Playgroud)

这将打印出来:

2.0 != 2.5
Run Code Online (Sandbox Code Playgroud)

为什么?在计算a时,java将5和2视为整数并进行整数除法,然后将结果转换为double.在计算b时你告诉java 5实际上是双精度,它执行双重除法.