Java字节数组中的无符号字节

时间:2017-06-29 19:35:34

标签: java arrays byte unsigned

这似乎是一个简单的问题,但我很困惑。

byte[] bArray = new byte[]{(byte) (0x80 & 0xff)};
System.out.println(bArray[0]);

我的输出是-128。为什么? 我怎样才能重写这个,以便字节数组包含128? 我认为0xff使它无符号。 谢谢你的帮助!

3 个答案:

答案 0 :(得分:7)

  

我认为0xff使它无符号。

嗯,确实如此 - 它将它提升为int,并保留最后8位。

但是,您将其结果转换回byte,而Java中的byte 始终签名。 (这很烦人,但它就是这样。)所以你不妨写一下:

byte[] bArray = { (byte) 0x80 };

结果将完全相同。

你正在存储你想要存储的位模式(10000000),所以如果你在其他地方传输它,你不必担心...它只是当你将它作为{{1}查看时在Java中,它很烦人。

答案 1 :(得分:2)

根据Java Language Specification 4.2.1

的字节值范围
  

对于字节,从-128到127,包括

所以没有办法(在Java中)一个字节将保持(字节)128。

您可以将字节转换为int并应用& 0xff来获取字节的无符号表示(作为int)。但如果你把它转回一个字节,它将再次被解释为-128到127之间的有符号值...

如果您只关心打印:

System.out.println(bArray[0] & 0xff);

或,对于十六进制

System.out.printf("0x%02x\n", bArray[0]);

答案 2 :(得分:1)

我的答案附在大图enter image description here