2011-12-29 39 views
7

Tôi đang chạy Clojure 1.3.0 với La Clojure trong IntelliJ IDEA khi đọc niềm vui của Clojure, và trên phần 4.1.3 (trang 64), các tác giả thể hiện tràn số nguyên với đoạn mã sau:Không nhận được tràn số nguyên trong Clojure?

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

Tuy nhiên, khi tôi thử nó ra trên REPL, tôi nhận được thay vì

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

user=> Integer/MAX_VALUE 
2147483647 

gì đang xảy ra ở đây? Tại sao các số nguyên của tôi được thêm chính xác thay vì tràn?

+0

Tôi có ngoại lệ đó, bạn có chắc không ..? –

+0

@KugathasanAbimaran Tôi đã sao chép tất cả những thứ đó, vì vậy tôi khá chắc chắn ...: O – wrongusername

+0

@wrongusernaem: Tôi đang sử dụng '1.2.0' và nhận ngoại lệ đó. Có vẻ như cuốn sách [ấn bản đó] sử dụng '1.2.0'. Và ** gertalot ** có giải pháp. –

Trả lời

8

(đã chỉnh sửa) Clojure (ít nhất 1.3.0) tự động chuyển đổi số nguyên thành dài nếu cần. Để biết thêm chi tiết về hỗ trợ boxing tự động, khuyến mãi và kiểu số nguyên trong Clojure 1.3.0, hãy kiểm tra Documentation for Clojure 1.3.0 Numerics.

Lý do bạn không nhận được một tràn là vì Clojure tự động chuyển đổi các số nguyên cho một dài, do đó (+ Integer/MAX_VALUE Integer/MAX_VALUE) được thêm hai chờ đợi:

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

Trong Clojure tất cả các số nguyên primative là primative chờ đợi và tài liệu trên trang số học là đề cập đến điều đó. trong 1.3 bạn chỉ cần số lớn hơn để có được tràn của bạn.

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

Điều quan trọng là các phiên bản cũ hơn của clojure sẽ tự động được tự động hóa lớn và quyết định không phải là trường hợp cực kỳ hiếm hoi. nếu bạn thực sự muốn quảng bá việc sử dụng toán học +'

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

Cảm ơn bạn đã giải thích về việc quảng bá toán học. – goatslacker

Các vấn đề liên quan