Java 中将字节转换为无符号字节

2025年3月17日 | 阅读 3 分钟

在 Java 中,byte 是一个数据类型。它表示 **8 位有符号**(正或负)值,范围从 -**128 到 127**。无符号字节的范围是 **0 到 255**。请注意,Java 不提供无符号字节。如果我们想将数字表示为无符号字节,我们必须将 byte 强制转换为 int,然后使用掩码(&)将新的 int 与 &0xff 进行位与运算。这会得到最后 8 位,或者阻止符号扩展。

示例

byte b = -1;

int num = b &0xff //将 byte 转换为无符号字节(存储在 int 中)

为什么需要类型转换(byte 转 int)?

当我们想在 Java 中表示有符号数字时,我们会遇到补码(2's complement)。在补码中,最左边的位表示符号(正或负)。位 0 表示正数,位 1 表示负数。其余的位表示从 -128 到 127 的值。因此,它被称为 8 位字节,但只有 7 位用于存储值。其他额外的值,范围在 128 到 255 之间,无法放入单个字节中。所以,我们可以将其转换为 32 位无符号整数以获得更多空间(位)。

字节到无符号字节

下表显示了字节到无符号字节(int)的转换。

Byte无符号字节
11
22
127127
-128128
-127129
-126130
-2254
-1255

转换过程

首先,我们将 8 位的字节转换为 32 位。例如,转换 -1。

使用以下步骤找到 -1 的二进制有符号补码

  • 写出 1 的二进制形式,即 **0000 0001**
  • 反转二进制位,即 **1111 1110**。
  • 在反转后的位上加 1,即 **1111 1111**

因此,我们得到 -1 的二进制形式,即 **1111 1111**。其中最左边的位 1 表示负号,而 0 表示正号。

请注意,当我们把一个 byte 转换或强制转换为 int 时,它的位数会从 **8 位增加到 32 位**。此时会应用符号扩展,并用扩展位填充值。

8 位表示 1111 1111 (-1)

将 **byte 转换为 int**

32 位表示 符号扩展

现在,我们将通过执行 &x0ff(按位与)来获得最后 8 位。

Java Convert Bytes to Unsigned Bytes

最后,将二进制转换为十进制。

1111 1111

128+64+32+16+8+4+2+1=255

因此 -1 对应 **255**。

使用 Java 8 的 Byte.toUnsignedInt() 方法

Java 8 提供了在 **Byte** 类中定义的内置方法 **toUnsignedInt()**。它支持无符号操作。该方法将有符号字节转换为无符号整数。

在无符号转换中,int 的高 24 位为零,低 8 位等于 byte 参数的位。

因此,零和正字节值被映射到数值上相等的 int 值,而负字节值被映射到比输入值加上 28 更大的 int 值。

语法

该方法接受一个值进行无符号 int 转换。它返回将参数通过无符号转换后的 int 值。

BytetoUnsignedByte1.java

输出

-8
248

让我们看另一种将 byte 转换为无符号整数的方法。

BytetoUnsignedByte2.java

输出

244

上面的程序也可以这样写。

BytetoUnsignedByte3.java

输出

Given Number: -5
251