2011-12-29 68 views
7

我運行的Clojure 1.3.0與香格里拉的Clojure在IntelliJ IDEA的,而讀的喜悅Clojure的,並在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

我得到了那個例外,你確定..? – 2011-12-29 05:45:17

+0

@KugathasanAbimaran我複製了所有這一切,所以我很確定...:O – wrongusername 2011-12-29 06:03:02

+0

@wrongusernaem:我使用'1.2.0'並獲取該異常。看起來像書[該版本]使用'1.2.0'。 ** gertalot **有解決方案。 – 2011-12-29 06:19:05

回答

8

(編輯)如果需要,Clojure(至少1.3.0)會自動將整數轉換爲long。有關Clojure 1.3.0中的自動裝箱,提升和原始數值類型支持的更多詳細信息,請查看Documentation for Clojure 1.3.0 Numerics

你沒有得到溢出的原因是因爲Clojure的自動轉換的整數長,所以(+ Integer/MAX_VALUE Integer/MAX_VALUE)是增加了兩個多頭:

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

在Clojure中所有靈長類動物的整數是靈長類動物的多頭和數字頁面上的文檔就是指那個。在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 2012-10-05 22:46:02