当我分配大于字节的值时会发生什么?

时间:2019-05-05 08:19:42

标签: java casting byte

当我分配的值大于字节时会发生什么?

根据正式的oracle文档,Byte

  •   

    字节:字节数据类型是8位带符号的二进制补码整数。   最小值为-128,最大值为127(含)。   字节数据类型对于在大型数组中保存内存很有用,   真正节省内存的地方。它们也可以用于   int的地方,其限制有助于阐明您的代码;事实   变量范围受限制可以作为一种形式   文档

我的代码是

public class B
{

    public static void main(String args[])
    {
        byte b;
        b=(byte)129;
        System.out.println("b="+b);

    }
}   

输出:

b=-127

当我分配的值大于字节时会发生什么。 Java编译器将报告错误。 我将这个值转换为字节

byte b = (byte) 128;

我不明白该程序的输出吗?

3 个答案:

答案 0 :(得分:5)

对于字节类型,只有8位存储值。您只能有256个不同的值(2 ^ 8 = 256)。 Java代表负值,最高位为“ 1”:

-128 (dec) => 10000000 (bit)
-127 (dec) => 10000001 (bit)
... 
-1   (dec) => 11111111 (bit)
0    (dec) => 00000000 (bit)
+1   (dec) => 00000001 (bit)
+127 (dec) => 01111111 (bin)

当您尝试设置需要存储一个以上字节的值时,会发生将最低字节设置为字节值的情况:

+129 (dec) => 00000000 00000000 00000000 10000001  (int representation)

but 10000001 (bit) is -127 (dec) in byte representation of java type (as described above)

要更好地理解Java中的溢出问题,请参阅文章:https://medium.com/@jeanvillete/java-numeric-overflow-underflow-d6b206f96d88

答案 1 :(得分:3)

129是一个整数文字,并且由于其后没有Ll,因此它的类型为int。它具有32位(4字节):

0000 0000  0000 0000  0000 0000  1000 0001

完成向byte 5.1.3. Narrowing Primitive Conversion cast 转换后,将丢弃除低8位以外的所有其他比特,因此这些值适合byte

在您的示例中,我们将以低8位结尾

1000 0001

由于Java使用二进制补码来表示byte,因此该数字被视为负数,因为设置了最高位。

如果值为257,则其二进制表示形式为:

0000 0000  0000 0000  0000 0001  0000 0001

转换为byte的方式是:

0000 0001

或仅+1(未设置最高位)。

链接:

答案 2 :(得分:-1)

因为字节数据类型根据名称为1个字节。因此,其范围是-127至+126(即容量为256)。因此,不能将+129存储为字节数据类型。因此+129被截断为-127。