Clojure,我希望Long乘法溢出

Fal*_*lko 5 clojure integer-overflow

我想做64位算术(不是自然数),所以我需要两个long的乘法来静默地溢出.

(unchecked-multiply Long/MAX_VALUE 3)
Run Code Online (Sandbox Code Playgroud)

诀窍.但

(def n Long/MAX_VALUE)
(unchecked-multiply n 3)
Run Code Online (Sandbox Code Playgroud)

给出溢出异常.我究竟做错了什么?

(Clojure 1.5.1)

Mic*_*zyk 7

在第一种情况下,两个参数都是未装箱long的,因此使用了(long, long)重载clojure.lang.Numbers.unchecked_multiply.正如预期的那样,它不会溢出.

在第二种情况下,n是盒装的,因此(Object, Object)调用重载,并简单地委托multiply抛出溢出的方法.

你需要说

(unchecked-multiply (long n) 3)
Run Code Online (Sandbox Code Playgroud)

以便使用(long, long)过载.