Java Int 到 Byte 转换中的意外行为
在 Java 中将整数 (int) 转换为字节 (byte) 时,可能会出现意想不到的结果。考虑以下代码:
int i = 132; byte b = (byte) i; System.out.println(b);
令人惊讶的是,输出不是 132 而是 -124。要理解其中的原因,我们需要深入研究 Java 中基本类型的内部表示。
有符号数和补码
在 Java 中,整数是 32 位有符号的整数,而字节是 8 位有符号整数。有符号整数可以使用二进制补码表示法表示正值和负值。在此表示法中,最左边的位 (MSB) 决定数字的符号,0 表示正数,1 表示负数。
从 Int 转换为 Byte
当从 int 转换为 byte,Java 保留符号位并丢弃剩余的 24 位。这意味着如果 int 值为正,则生成的字节值也将为正。但是,如果 int 值为负数(如我们的示例所示),则生成的字节值将显示为负数。
二进制补码反转
要理解这种负面行为,我们需要考虑补码反转过程。为了表示负数,二进制补码将所有位反转并在结果上加 1。在我们的例子中,int 值 132 的二进制值是 10000100。将位反转并加 1 得到 01111011,十进制表示为 -124。
无符号字节值
在我们的示例中,我们通常期望字节值是无符号的,这会给我们一个正值 132 而不是 -124。要从字节中获取无符号值,我们可以应用一个位掩码来删除符号位并仅提取低 8 位。
byte signedByte = -124; int unsignedByte = signedByte & 0xff; System.out.println("Signed: " + signedByte + " Unsigned: " + unsignedByte);
这将打印“Signed: -124 Unsigned: 132”,给出我们想要的无符号值。
以上是为什么Java的Int转Byte会得到负值?的详细内容。更多信息请关注PHP中文网其他相关文章!