在Clojure中没有得到整数溢出?

时间:2011-12-29 04:44:11

标签: clojure clojure-1.3

我在读取欢乐的Clojure 时使用IntelliJ IDEA中的La Clojure运行Clojure 1.3.0,并且在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

这里发生了什么?为什么我的整数被正确添加而不是溢出?

2 个答案:

答案 0 :(得分:8)

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

你没有得到溢出的原因是因为Clojure自动将整数转换为long,所以(+ Integer/MAX_VALUE Integer/MAX_VALUE)正在添加两个long:

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

答案 1 :(得分: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