5

私は 64 ビットの算術演算 (自然数ではない) を行いたいので、たとえば、静かにオーバーフローするには 2 つの long の乗算が必要です。

(unchecked-multiply Long/MAX_VALUE 3)

トリックを行います。しかし

(def n Long/MAX_VALUE)
(unchecked-multiply n 3)

オーバーフロー例外を発生させます。私は何を間違っていますか?

(クロージュア 1.5.1)

4

1 に答える 1

7

最初のケースでは、両方の引数がボックス化されていないlongs であるため、(long, long)オーバーロードのclojure.lang.Numbers.unchecked_multiplyが使用されます。予想どおり、オーバーフローでスローされません。

2 番目のケースでnは、ボックス化されているため、オーバーロードが呼び出され、オーバーフローをスロー(Object, Object)するメソッドに単純に委譲されます。multiply

あなたが言う必要があります

(unchecked-multiply (long n) 3)

過負荷が使用されるように(long, long)

于 2013-09-09T13:35:30.280 に答える