如何在 Clojure 中将大于 127 的整数转换为字节

How to cast an int larger than 127 to a byte in Clojure

字节0xea等于10进制的234。在Python中,字节使用无符号整数表示,但在Java中,它们是signed, two's complement integers

例如,在Java中,如果我转换(byte)234,我得到有符号整数-22。当我在 MessageDigest 中使用这些字节时,我得到与在 python 中使用无符号 234 时相同的哈希输出。所以我确信这些代表相同的字节。

然而,在 Clojure 中,函数 (byte 234) 应该转换为 -22,但它会抛出 clojure.lang.RT.byteCast 异常。

如何在 Clojure 中将整数转换为字节?

可以溢出的时候应该用unchecked-byte:

(unchecked-byte 234)
=> -22

仅供参考,也可以使用 *unchecked-math* 绑定切换默认行为:

(set! *unchecked-math* true)
=> true
(byte 234)
=> -22

但您可能希望将此非默认行为限制在尽可能小的范围内。