Java 中的无符号字节
默认情况下,Java 中的字节是签名的。我在其他帖子中看到,具有未签名字节的解决方法与此类似:int num = (int) bite & 0xFF
有人可以向我解释为什么这有效并将有符号字节转换为无符号字节,然后将其各自的整数吗? 一个字节与11111111产生相同的字节 - 对吧?ANDing
默认情况下,Java 中的字节是签名的。我在其他帖子中看到,具有未签名字节的解决方法与此类似:int num = (int) bite & 0xFF
有人可以向我解释为什么这有效并将有符号字节转换为无符号字节,然后将其各自的整数吗? 一个字节与11111111产生相同的字节 - 对吧?ANDing
类型转换的优先级高于运算符。因此,您首先要转换为int,然后进行ANDing以掩盖所有设置的高阶位,包括java使用的两者的补码表示法的“符号位”,只留下原始字节的正值。例如:&
let byte x = 11111111 = -1
then (int) x = 11111111 11111111 11111111 11111111
and x & 0xFF = 00000000 00000000 00000000 11111111 = 255
并且您已经有效地从原始字节中删除了符号。
用11111111的AND一个字节会产生相同的字节 - 对吧?
除了你用00000000000000000000000011111111进行ANDing,因为0xFF是一个文字 - Java中没有文字。因此,发生的事情是将 提升到(类型转换是不必要的),其符号扩展(即保留 的可能负值,但随后通过用所有这些零对其进行 AND 来恢复符号扩展。结果是,其最低有效位恰好与前者完全相同,因此,如果它无符号,它将具有的值。int
byte
byte
int
byte
int
byte
byte