Clojure 在函数内部强制转换长整数

Clojure 在函数内部强制转换长整数,clojure,casting,long-integer,Clojure,Casting,Long Integer,我正在编写一个函数,它将三个数字(r、g、b)转换为一个整数,java.awt.Color (defn to-rgb ([r g b] (bit-or (long 4278190080) ; the alpha channel = (bit-shift-left 255 24) (bit-shift-left r 16) (bit-shift-left g 8) b))) 使用Color构造函数

我正在编写一个函数,它将三个数字(r、g、b)转换为一个整数,
java.awt.Color

(defn to-rgb
  ([r g b] (bit-or
            (long 4278190080) ; the alpha channel = (bit-shift-left 255 24)
            (bit-shift-left r 16)
            (bit-shift-left g 8)
            b)))
使用
Color
构造函数和
.getRGB

bitmap> (.getRGB (Color. 0 0 0))
-16777216
bitmap> (type (.getRGB (Color. 0 0 0)))
java.lang.Integer
(Integer/toBinaryString (.getRGB (Color. 0 0 0)))
"11111111000000000000000000000000"
然后是我的版本。所以我需要转换成一个
整数

bitmap> (to-rgb 0 0 0)
4278190080
bitmap> (Integer. (to-rgb 0 0 0))
-16777216 ; as expected
所以我决定将强制转换放在函数中,因为我总是希望返回一个整数

(defn to-rgb2
  ([r g b] (Integer. (bit-or
                      (long 4278190080)
                      (bit-shift-left r 16)
                      (bit-shift-left g 8)
                      b))))

bitmap> (to-rgb2 0 0 0)
IllegalArgumentException Value out of range for int: 4278190080  clojure.lang.RT.intCast (RT.java:1205)

在Java中,整数只有32位。将其更改为
Long

(Long. ...)
问题是常量
4278190080
以十六进制转换为
0xFF000000
,我们看到设置了最左边的位。在Java中,由于整数值是32位有符号的,所以不能设置最左边的位,因为它在二补表示法中是为负数保留的

java.lang.Integer.MAX_VALUE = 0x7FFFFFFF
用十六进制


更新

如果需要将其作为32位值,请使用
Long.intValue()
如下所示:

(defn to-rgb3
  ([r g b] (.intValue
             (Long. (bit-or
                      (long 4278190080)
                      (bit-shift-left r 16)
                      (bit-shift-left g 8)
                      b)))))
(dotest
  (spyxx (to-rgb3 0 0 0)))

(to-rgb3 0 0 0) => java.lang.Integer->-16777216

但是我需要值
-16777216
,它来自于将long转换为整数。它应该与
(.getRGB(Color.0))
的返回值相匹配。我想我的编辑使它更清晰了不是吗?我的问题是,为什么强制转换在函数外部工作(是的,它转换为neg),而不是在函数内部工作?
。intValue
就是我要找的:)请注意,
.intValue
返回一个原始Java
int
,然后哪个Clojure自动装箱到一个
Integer
对象中。
Number.intValue
在纯Clojure中更习惯地表示为
unchecked int