我在读取欢乐的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
这里发生了什么?为什么我的整数被正确添加而不是溢出?
答案 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