这似乎是一个简单的问题,但我很困惑。
byte[] bArray = new byte[]{(byte) (0x80 & 0xff)};
System.out.println(bArray[0]);
我的输出是-128。为什么?
我怎样才能重写这个,以便字节数组包含128?
我认为0xff
使它无符号。
谢谢你的帮助!
答案 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)