kmo*_*ort 1 java enums primitive-types
鉴于下面的枚举,
enum SizeUnits {
Bytes(1),
Kilobytes(1024),
Megabytes(1024 * 1024),
Gigabytes(1024 * 1024 * 1024),
Terabytes(1024 * 1024 * 1024 * 1024),
Petabytes(1024 * 1024 * 1024 * 1024 * 1024);
private final long multiplier;
private SizeUnits(long mult) {
this.multiplier = mult;
System.out.println("mult="+mult);
}
}
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
mult=1
mult=1024
mult=1048576
mult=1073741824
mult=0
mult=0
Run Code Online (Sandbox Code Playgroud)
显然,最后两个是在内部剪切,我不明白为什么.它看起来并不像它应该的,因为我使用的是long与长期声称最大值与Java 8是:
2^64-1.
如果它是以整数的大小剪裁,我本来期望它也剪辑1073741824.此外,它不仅仅是环绕,而是实际将值剪切为零.
为什么它将最后两个条目剪辑为零?
啊.文字的类型.当然.
注意(如下面的答案所述)如果我将该行L作为该行的最后一个条目,它仍然会溢出更大的情况,因为很明显它没有将操作提升long到溢出之前.
现在,当试图通过它进行投射时,为什么它不起作用是有道理的
(long)(1024 * 1024 * 1024 * 1024 * 1024)
Run Code Online (Sandbox Code Playgroud)
但这有效:
(1024 * 1024 * (long)1024 * 1024 * 1024)
Run Code Online (Sandbox Code Playgroud)
这是它何时溢出的问题.谢谢大家!
最后两个溢出.它们等于2^40并且2^50
不适合int.这些是整数,而不是长期.
添加L到第一个1024值:
Terrabytes(1024L * 1024 * 1024 * 1024)
当你添加时,L你明确地说它很长.
然后其他操作数也被提升为long,
结果不会溢出.
还尝试:
1)long x = 1024 * 1024 * 1024 * 1024 * 1024;
2)long y = 1024L * 1024 * 1024 * 1024 * 1024;
看看你会得到什么值x和y.
| 归档时间: |
|
| 查看次数: |
291 次 |
| 最近记录: |