Java 中的无符号字节

2022-09-02 23:06:14

默认情况下,Java 中的字节是签名的。我在其他帖子中看到,具有未签名字节的解决方法与此类似:int num = (int) bite & 0xFF

有人可以向我解释为什么这有效并将有符号字节转换为无符号字节,然后将其各自的整数吗? 一个字节与11111111产生相同的字节 - 对吧?ANDing


答案 1

类型转换的优先级高于运算符。因此,您首先要转换为int,然后进行ANDing以掩盖所有设置的高阶位,包括java使用的两者的补码表示法的“符号位”,只留下原始字节的正值。例如:&

let byte x = 11111111 = -1
then (int) x = 11111111 11111111 11111111 11111111
and x & 0xFF = 00000000 00000000 00000000 11111111 = 255

并且您已经有效地从原始字节中删除了符号。


答案 2

用11111111的AND一个字节会产生相同的字节 - 对吧?

除了你用00000000000000000000000011111111进行ANDing,因为0xFF是一个文字 - Java中没有文字。因此,发生的事情是将 提升到(类型转换是不必要的),其符号扩展(即保留 的可能负值,但随后通过用所有这些零对其进行 AND 来恢复符号扩展。结果是,其最低有效位恰好与前者完全相同,因此,如果它无符号,它将具有的值。intbytebyteintbyteintbytebyte