Clojure中int的值超出范围

时间:2016-06-18 19:41:14

标签: java clojure

通常在LibGDX中编程时,传递Color类的十六进制值的整数可以正常工作:

new Color(0xeaeaeaff);

但是从Clojure做到这一点......

(Color. 0xeaeaeaff)

...生成错误java.lang.IllegalArgumentException:int超出范围的值:3,941,264,128。当然,价值看起来超出了范围,非常如此。但是,当我通常使用Java时,根本没有问题吗?

Clojure值定义如下:

(def color 0xff00ffff)

为什么会这样?

3 个答案:

答案 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))