2016-06-18 35 views
1

常而在LibGDX編程,通過Color類爲十六進制整數工作得很好:值超出範圍爲INT Clojure中

new Color(0xeaeaeaff); 

但是從Clojure的這樣......

(Color. 0xeaeaeaff) 

...生成錯誤java.lang.IllegalArgumentException:值超出int的範圍:3,941,264,128。當然,價值確實超出了範圍,非常如此。但是當我通常使用Java來完成時,完全沒有問題?

Clojure的價值定義,像這樣:

(def color 0xff00ffff) 

爲什麼會出現這種情況?

回答

1

0xeaeaeaff在Java中表示一個負數:-353703169並導致Clojure溢出(Java只是將其溢出爲負數)。

在你在Java中的情況下0xeaeaeaff是基地10等於-353703169你可以寫,就像用Clojure -353703169,或作爲-16r15151501基地16。

正如noisesmith指出的那樣,您可以使用unchecked-int

+0

在Clojure中,-16r353703169超出範圍。也許你的意思是-16reaeaeaff?不過,它驗證的值超出範圍。 –

+0

對不起,錯字。我已經修復它 - 它應該是'-16r15151501'作爲'353703169'基數10等於'15151501'基數16. –

+0

是否有可能做某種形式的十六進制符號,而不是首先驗證通過十六進制驗證的整數Java的?也就是說,是否有可能寫類似於-16reaeaeaff驗證到Java的0xeaeaeaff的東西? –

1

在Java中,使用文字符號爲十六進制數產生int S,SO 0xeaeaeaff是一個值爲-353703169一個int,因爲它超過了整數的最大值,溢出和成爲負int值。 在Clojure 0xeaeaeaff中產生一個長度爲​​的值。

類LibGDX的com.badlogic.gdx.graphics.Color有一個構造函數期望一個int卻沒有一個期望一個long,它要傳遞到它在Clojure的情況下,因此異常:java.lang.IllegalArgumentException: Value out of range for int: 3,941,264,128.

你可以只通過-353703169到構造函數或使用(Integer/parseUnsignedInt "eaeaeaff" 16)像Piotrek建議,因爲它可能會更方便易,可能通過包裝函數:

(defn hex->int [arg] 
    (Integer/parseUnsignedInt arg 16)) 
+2

解釋很好,但不需要這個函數:只需使用['unchecked-int'](http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/unchecked -int),'(unchecked-int 0xeaeaeaff)'。 – glts

+0

不知道,謝謝:) – MicSokoli

3

得到相同值的Java將連鎖行業的最簡單方法如果您輸入的字面意思相同,則使用unchecked-int。它會像原始數據一樣返回一個負數(溢出)數字,而不是給出超出界限的錯誤。

+user=> (unchecked-int 0xeaeaeaff) 
-353703169