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)
在第一种情况下,两个参数都是未装箱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)过载.