通常在LibGDX中编程时,传递Color类的十六进制值的整数可以正常工作:
new Color(0xeaeaeaff);
但是从Clojure做到这一点......
(Color. 0xeaeaeaff)
...生成错误java.lang.IllegalArgumentException:int超出范围的值:3,941,264,128。当然,价值看起来超出了范围,非常如此。但是,当我通常使用Java时,根本没有问题吗?
Clojure值定义如下:
(def color 0xff00ffff)
为什么会这样?
答案 0 :(得分:3)
获得与Java相同的值(使用与输入相同的文字)的最简单方法是使用unchecked-int
。它将返回一个负数(溢出)数字,就像原始数字一样,而不是给出一个越界错误。
+user=> (unchecked-int 0xeaeaeaff)
-353703169
答案 1 :(得分:1)
0xeaeaeaff
in Java represents a negative number: -353703169
and causes overflow in Clojure (Java is just overflowing it to a negative number).
In your case 0xeaeaeaff
in Java is equal to -353703169
in base 10. You can write it just as -353703169
in Clojure, or in base 16 as -16r15151501
.
You can use unchecked-int
as pointed out by noisesmith.
答案 2 :(得分:1)
在Java中,对十六进制数字使用文字表示法产生int
s,因此0xeaeaeaff
是一个值为-353703169
的int,因为它超过了整数的最大值,溢出并变为负的int。
在Clojure 0xeaeaeaff
中生成一个值为3941264127
的长整数。
LibGDX的类com.badlogic.gdx.graphics.Color
有一个构造函数,它需要一个int
而不是一个期望long
的构造函数,你在Clojure案例中将它传递给它,因此异常: java.lang.IllegalArgumentException: Value out of range for int: 3,941,264,128.
您可以将-353703169
传递给构造函数或像Piotrek建议的那样使用(Integer/parseUnsignedInt "eaeaeaff" 16)
,因为它可能更方便,可能通过包装函数:
(defn hex->int [arg]
(Integer/parseUnsignedInt arg 16))