如何在 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
但您可能希望将此非默认行为限制在尽可能小的范围内。
字节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
但您可能希望将此非默认行为限制在尽可能小的范围内。