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

Ama*_*man 1 java byte casting

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

根据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);

    }
}   
Run Code Online (Sandbox Code Playgroud)

输出:

b=-127
Run Code Online (Sandbox Code Playgroud)

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

byte b = (byte) 128;
Run Code Online (Sandbox Code Playgroud)

我不明白该程序的输出?

Mat*_* I. 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Run Code Online (Sandbox Code Playgroud)

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