首页  >  文章  >  Java  >  为什么Java的Int转Byte会得到负值?

为什么Java的Int转Byte会得到负值?

Linda Hamilton
Linda Hamilton原创
2024-11-08 13:35:02128浏览

Why Does Java's Int-to-Byte Conversion Result in a Negative Value?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn