2011-12-29 12 views
7

Me postulo Clojure 1.3.0 con La Clojure en IntelliJ IDEA durante la lectura La alegría de Clojure, y en el apartado 4.1.3 (página 64), los autores demuestran desbordamiento de enteros con el siguiente código:¿No se obtiene el desbordamiento de enteros en Clojure?

(+ Integer/MAX_VALUE Integer/MAX_VALUE) 
;=> java.lang.ArithmeticException: integer overflow 

Sin embargo, cuando intento hacia fuera en el REPL, consigo en lugar

user=> (+ Integer/MAX_VALUE Integer/MAX_VALUE) 
4294967294 

user=> Integer/MAX_VALUE 
2147483647 

¿Qué está pasando aquí? ¿Por qué mis números enteros se agregan correctamente en lugar de desbordar?

+0

Tengo esa excepción, ¿está seguro ...? –

+0

@KugathasanAbimaran Copié y pegué todo eso, así que estoy bastante seguro ...: O – wrongusername

+0

@wrongusernaem: Estoy usando '1.2.0' y obtengo esa excepción. Parece que el libro [esa edición] usa '1.2.0'. Y ** gertalot ** tiene la solución. –

Respuesta

8

(corregido) Clojure (al menos 1.3.0) convierte automáticamente el entero en un largo si es necesario. Para obtener más información sobre el boxeo automático, la promoción y el soporte de tipo numérico primitivo en Clojure 1.3.0, consulte el Documentation for Clojure 1.3.0 Numerics.

La razón por la que no obtiene un desbordamiento se debe a Clojure convierte automáticamente el número entero a una larga, por lo (+ Integer/MAX_VALUE Integer/MAX_VALUE) es la adición de dos largos:

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

En Clojure todos los enteros primariedad son largos y los primariedad la documentación en la página numérica se refiere a eso. en 1.3 solo necesitas números más grandes para obtener tu desbordamiento.

user=> (+ Long/MAX_VALUE Long/MAX_VALUE) 
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1374) 

Esta parte importante es que las versiones anteriores de clojure habrían ascendido a un gran int automáticamente y se decidió que el costo de esto no valía la pena los casos extremadamente raros en que se desea. si realmente desea promover el uso de las matemáticas +'

user=> (+' Long/MAX_VALUE Long/MAX_VALUE) 
18446744073709551614N 
+0

Gracias por la explicación de promover las matemáticas. – goatslacker

Cuestiones relacionadas