当我分配的值大于字节时会发生什么?
根据正式的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;
我不明白该程序的输出吗?
答案 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
是一个整数文字,并且由于其后没有L
或l
,因此它的类型为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。