2011-12-29 15 views
7

私はClojureのの喜びを読みながらClojureのはのIntelliJ IDEAにラClojureので1.3.0実行しています、とセクション4.1.3(64ページ)で、著者は、次のコードで整数オーバーフロー実証:Clojureで整数オーバーフローが発生していませんか?

(+ Integer/MAX_VALUE Integer/MAX_VALUE) 
;=> java.lang.ArithmeticException: integer overflow 
を私はREPLでそれを試してみたときに

しかし、私はここで何が起こっている

user=> (+ Integer/MAX_VALUE Integer/MAX_VALUE) 
4294967294 

user=> Integer/MAX_VALUE 
2147483647 

代わりに取得しますか?整数がオーバーフローするのではなく正しく追加されるのはなぜですか?

+0

私はその例外がありますか? –

+0

@KugathasanAbimaran私はそれをすべてコピーして貼ったので、私はかなり確信しています...:O – wrongusername

+0

@wrongusernaem:私は '1.2.0'を使用しています。本のような本は1.2.0を使用しています。 ** gertalot **には解決策があります。 –

答えて

8

Clojure(少なくとも1.3.0)は、整数を必要に応じて自動的に長整数に変換します。 Clojure 1.3.0での自動ボクシング、プロモーションおよびプリミティブ数値タイプのサポートの詳細については、Documentation for Clojure 1.3.0 Numericsを参照してください。

Clojureのは、自動的にその(+ Integer/MAX_VALUE Integer/MAX_VALUE)は2つのlong型追加され、長い整数に変換するので、あなたがオーバーフローを取得しない理由は次のとおりです。

user> (type Integer/MAX_VALUE) 
java.lang.Long 
8

Clojureのでは、すべてのプリミティブ整数であるプリミティブlong型と数値ページのドキュメントはそれを参照しています。 1.3ではオーバーフローを避けるために大きな数字が必要です。

user=> (+ Long/MAX_VALUE Long/MAX_VALUE) 
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1374) 

この重要な部分は、Clojureの以前のバージョンが自動的に大きなint型に昇格しているだろうし、それはこれのコストは、それが必要とされる非常に稀なケースの価値がなかったことが決定されたということです。あなたが本当に数学の使用を促進したい場合は+'

user=> (+' Long/MAX_VALUE Long/MAX_VALUE) 
18446744073709551614N 
+0

数学の推進の説明をありがとう。 – goatslacker

関連する問題