2011-12-29 18 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