我写下面的示例代码:
public static void main(String[] args) throws Exception
{
byte number_1 = 127;
byte number_2 = (byte) 128;
System.out.println("number_1 = " + number_1);
System.out.println("number_2 = " + number_2);
}
我在输出中得到以下结果:
number_1 = 127
number_2 = -128
我知道byte
数据类型的范围(-128
到127
)。
我的样品是否正确?发生了什么?有两个补码操作吗?我不明白这种行为。
答案 0 :(得分:12)
因为一个字节只能容纳-128到127,所以这是溢出的预期行为
for(int index = 0 ; index < 258 ; index ++ ){
System.out.println((byte)index);
}
另见
答案 1 :(得分:4)
这是因为字节范围。一个字节只能存储-128到127的值。
答案 2 :(得分:1)
来自原始数据类型的official documentation:
byte:字节数据类型是8位有符号二进制补码整数。 它的最小值为-128,最大值为127(含)。
回答你的问题:如何在java中设置大于127的int字节变量?
表示无符号字节的最佳方法是使用带符号整数 ,因为Java VM将字节表示为32位,您不能通过使用保存任何内容一个字节。
答案 3 :(得分:1)
您正在看到narrowing primitive conversion的效果:将整数文字128
投射到byte
会导致除了最后一个字节被抛出外的所有内容。整数的最后一个字节的值为10000000
,当在two's complement 中将其解释为一个字节的值时会出现-128
。
相反,相同的值被解释为左边用零填充的四字节值,即00000000 00000000 00000000 10000000
,等于128
。
答案 4 :(得分:0)
因为一个字节只能容纳-128到127,所以当你转换一个int时 大于127或小于-127,java编译器自动进行更改。 实际上,以下声明
byte number_2 = (byte) 128;
已更改为
byte number_2 = (byte) -128;
使用javap查看字节码后,您将找到它。
答案 5 :(得分:0)
最后一个字节数是127,第一个是-128,所以当数字是128时它变成-128,当数字是129时它变成-127 ..它继续直到它再次达到127然后再循环并成为-128 ..这就是我所理解的......我希望它清楚......