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
为什么会这样?
整数溢出,放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实际上是双精度,它执行双重除法.
| 归档时间: |
|
| 查看次数: |
1243 次 |
| 最近记录: |