wro*_*ame 7 clojure clojure-1.3
我在阅读The Joy Of Clojure时使用 IntelliJ IDEA中的La Clojure运行Clojure 1.3.0 ,并在4.1.3节(第64页)中,作者使用以下代码演示整数溢出:
(+ Integer/MAX_VALUE Integer/MAX_VALUE)
;=> java.lang.ArithmeticException: integer overflow
Run Code Online (Sandbox Code Playgroud)
但是,当我在REPL上尝试时,我得到了
user=> (+ Integer/MAX_VALUE Integer/MAX_VALUE)
4294967294
user=> Integer/MAX_VALUE
2147483647
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?为什么我的整数被正确添加而不是溢出?
(编辑)如果需要,Clojure(至少1.3.0)会自动将整数转换为long.有关Clojure 1.3.0中自动装箱,升级和原始数字类型支持的更多详细信息,请查看Clojure 1.3.0 Numerics的文档.
你没有得到溢出的原因是因为Clojure自动将整数转换为long,所以(+ Integer/MAX_VALUE Integer/MAX_VALUE)
添加两个long:
user> (type Integer/MAX_VALUE)
java.lang.Long
Run Code Online (Sandbox Code Playgroud)
在Clojure中,所有的原始整数都是原始的长整数,而数字页面上的文档就是指那个.在1.3中你只需要更大的数字来获得溢出.
user=> (+ Long/MAX_VALUE Long/MAX_VALUE)
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1374)
Run Code Online (Sandbox Code Playgroud)
这个重要的部分是旧版本的clojure会自动升级为一个大的int,并且决定在不需要它的极少数情况下,这个成本是不值得的.如果你真的想要促进数学运用+'
user=> (+' Long/MAX_VALUE Long/MAX_VALUE)
18446744073709551614N
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1077 次 |
最近记录: |