私は 64 ビットの算術演算 (自然数ではない) を行いたいので、たとえば、静かにオーバーフローするには 2 つの long の乗算が必要です。
(unchecked-multiply Long/MAX_VALUE 3)
トリックを行います。しかし
(def n Long/MAX_VALUE)
(unchecked-multiply n 3)
オーバーフロー例外を発生させます。私は何を間違っていますか?
(クロージュア 1.5.1)
私は 64 ビットの算術演算 (自然数ではない) を行いたいので、たとえば、静かにオーバーフローするには 2 つの long の乗算が必要です。
(unchecked-multiply Long/MAX_VALUE 3)
トリックを行います。しかし
(def n Long/MAX_VALUE)
(unchecked-multiply n 3)
オーバーフロー例外を発生させます。私は何を間違っていますか?
(クロージュア 1.5.1)
最初のケースでは、両方の引数がボックス化されていないlong
s であるため、(long, long)
オーバーロードのclojure.lang.Numbers.unchecked_multiply
が使用されます。予想どおり、オーバーフローでスローされません。
2 番目のケースでn
は、ボックス化されているため、オーバーロードが呼び出され、オーバーフローをスロー(Object, Object)
するメソッドに単純に委譲されます。multiply
あなたが言う必要があります
(unchecked-multiply (long n) 3)
過負荷が使用されるように(long, long)
。