在Java中,是否有一种简单而优雅的方法将无符号字节值转换为有符号字节值?例如,如果我只有int值240(二进制表示为(24位+11110000)=32位),我该如何获得此int的有符号值?
在Java中,除了char
外,所有原始数据类型都是有符号的。你不能拥有一个无符号的字节。
唯一可以做的就是将无符号的字节转换为整数,这样您就可以读取其正确的值:
int a = b & 0xff
如果你想在byte类型中存储一个无符号的Byte值,显然可以这样做,但每次需要“处理”它时,请记得像上面展示的那样再次将其转换。
Java没有无符号值,除了char
。考虑下面的代码片段:
byte val = (byte)255;
System.out.println(String.valueOf(val));
char
是无符号类型。 - Nayukibyte b = (byte) 144; // binary value = 10010000
如果将 b
转换为 int
,以下情况会发生:
int i = b;
System.out.println("value: "+i);
System.out.println("binary: " + Integer.toBinaryString(i));
输出:
value: -112 <- Incorrect value
binary: 11111111111111111111111110010000
int mask = 0x000000FF; // This is often shortened to just 0xFF
&
来“清除”最左边的24位,只留下我们原始的8位。int unsignedValue = b & mask; // value = 144
byte original = (byte) unsignedValue;
public int getUnsignedByte(byte[] bytes, int offset) {
return (bytes[offset] & 0xFF);
}
Java 只支持有符号字节,因此无论何时您在 byte 中放置一个值,它都被认为是有符号的。
byte b = (byte) 240;
char
是无符号的。 - Nayuki