Java Clojure中int的值超出范围

Java Clojure中int的值超出范围,java,clojure,Java,Clojure,通常,在LibGDX中编程时,将十六进制值的整数传递给Color类就可以了: new Color(0xeaeaeaff); 但是在Clojure做这件事 (Color. 0xeaeaeaff) 。。。生成错误java.lang.IllegalArgumentException:值超出int:3941264128的范围。确实,该值看起来超出了范围,非常明显。但是当我通常从Java来做的时候,根本就没有问题了 Clojure值的定义如下: (def color 0xff00ffff) 为什么会

通常,在LibGDX中编程时,将十六进制值的整数传递给Color类就可以了:

new Color(0xeaeaeaff);
但是在Clojure做这件事

(Color. 0xeaeaeaff)
。。。生成错误java.lang.IllegalArgumentException:值超出int:3941264128的范围。确实,该值看起来超出了范围,非常明显。但是当我通常从Java来做的时候,根本就没有问题了

Clojure值的定义如下:

(def color 0xff00ffff)

为什么会发生这种情况?

Java中的0xEAFF表示一个负数:
-353703169
并导致Clojure中溢出(Java只是将其溢出为负数)

在您的例子中,Java中的
0xeaff
等于基数10中的
-353703169
。您可以在Clojure中以
-353703169
的格式编写,也可以在base 16中以
-16r15151501
的格式编写


您可以使用noisesmith指出的
unchecked int

0xEAEAFF
在Java中表示负数:
-353703169
并导致Clojure溢出(Java只是将其溢出为负数)

在您的例子中,Java中的
0xeaff
等于基数10中的
-353703169
。您可以在Clojure中以
-353703169
的格式编写,也可以在base 16中以
-16r15151501
的格式编写


您可以使用noisesmith指出的
未选中的int

在Java中,使用十六进制数字的文字表示法生成
int
s,因此
0xeaeaeaff
是一个值为
-353703169
的int,因为它超过了int的最大值,溢出并成为负int。 在Clojure中,
0xeaff
生成一个值为
3941264127
的长字符串

LibGDX的类
com.badlogic.gdx.graphics.Color
有一个构造函数,该构造函数需要
int
,但没有一个构造函数需要
long
,在Clojure案例中,您将传递给它,因此出现异常:
java.lang.IllegalArgumentException:int的值超出范围:39412641128。

您可以将
-353703169
传递给构造函数,或者像Piotrek建议的那样使用
(Integer/parseUnsignedInt“eaeaff”16)
,因为这可能更方便,可能通过包装函数:

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

在Java中,对十六进制数使用文字表示法会产生
int
s,因此
0xeaeaeaff
是一个值为
-353703169
的int,因为它超过了int的最大值,溢出并成为负int。 在Clojure中,
0xeaff
生成一个值为
3941264127
的长字符串

LibGDX的类
com.badlogic.gdx.graphics.Color
有一个构造函数,该构造函数需要
int
,但没有一个构造函数需要
long
,在Clojure案例中,您将传递给它,因此出现异常:
java.lang.IllegalArgumentException:int的值超出范围:39412641128。

您可以将
-353703169
传递给构造函数,或者像Piotrek建议的那样使用
(Integer/parseUnsignedInt“eaeaff”16)
,因为这可能更方便,可能通过包装函数:

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

使用与输入相同的文本,获得Java将提供给您的相同值的最简单方法是使用
unchecked int
。它将返回一个负数(溢出),就像原始的一样,而不是给出一个越界错误

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

使用与输入相同的文本,获得Java将提供给您的相同值的最简单方法是使用
unchecked int
。它将返回一个负数(溢出),就像原始的一样,而不是给出一个越界错误

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

在Clojure中,-16r353703169远远超出范围。也许你的意思是-16雷亚夫?但是,它验证的值仍然超出范围。很抱歉输入错误。我已经修复了它-它应该是
-16r15151501
,因为
353703169
base 10等于
15151501
base 16。是否有可能使用某种形式的av十六进制表示法,而不必首先通过Java验证十六进制验证的整数?也就是说,是否可以向Java的0xEAEAFF写入类似于-16REEAFF验证的内容?
0xEAEAFF
超出范围,在Java中强制转换为
int
时会导致溢出为负数。您可以尝试
(Integer/parseUnsignedInt“eaeaeaff”16)
,其行为类似(需要Java 8)。0xeaeaeaff是有效的clojure数字文本。在clojure中,-16r353703169超出范围。也许你的意思是-16雷亚夫?但是,它验证的值仍然超出范围。很抱歉输入错误。我已经修复了它-它应该是
-16r15151501
,因为
353703169
base 10等于
15151501
base 16。是否有可能使用某种形式的av十六进制表示法,而不必首先通过Java验证十六进制验证的整数?也就是说,是否可以向Java的0xEAEAFF写入类似于-16REEAFF验证的内容?
0xEAEAFF
超出范围,在Java中强制转换为
int
时会导致溢出为负数。您可以尝试
(Integer/parseUnsignedInt“eaeaeaff”16)
,其行为类似(需要Java 8)。0xeaeaeaff是一个有效的clojure数字文本。解释很好,但不需要此函数:只需使用,
(unchecked int 0xeaeaeaff)
。解释很好,但不需要此函数:只需使用,
(未选中int 0xeaff)