Java Enum数据长值设置为零

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)

这是它何时溢出的问题.谢谢大家!

pet*_*rov 7

最后两个溢出.它们等于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;

看看你会得到什么值xy.