2016-06-18 34 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