Clojure中没有得到整数溢出?

Clojure中没有得到整数溢出?,clojure,clojure-1.3,Clojure,Clojure 1.3,我正在IntelliJ IDEA中运行Clojure 1.3.0和La Clojure,同时阅读Clojure的乐趣,在第4.1.3节(第64页)中,作者用以下代码演示整数溢出: (+ Integer/MAX_VALUE Integer/MAX_VALUE) ;=> java.lang.ArithmeticException: integer overflow 然而,当我在REPL上试用它时,我得到了相反的结果 user=> (+ Integer/MAX_VALUE Integer

我正在IntelliJ IDEA中运行Clojure 1.3.0和La Clojure,同时阅读Clojure的乐趣,在第4.1.3节(第64页)中,作者用以下代码演示整数溢出:

(+ 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
这里发生了什么?为什么我的整数被正确添加而不是溢出?

(已编辑)Clojure(至少1.3.0)会在必要时自动将整数转换为长整数。有关Clojure 1.3.0中自动装箱、升级和原语数字类型支持的更多详细信息,请查看

不会出现溢出的原因是Clojure会自动将整数转换为long,因此
(+integer/MAX\u VALUE integer/MAX\u VALUE)
会添加两个long:

user> (type Integer/MAX_VALUE)
java.lang.Long
在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

我得到了那个例外,你确定吗?@KugathasanAbimaran我复制粘贴了所有这些,所以我非常确定…:O@wrongusernaem:我正在使用
1.2.0
并获得该异常。似乎这本书[那个版本]使用了
1.2.0
。格塔洛特有了答案。谢谢你对推广数学的解释。