在java中设置大于127的int字节变量

时间:2012-06-25 05:45:04

标签: java casting byte

我写下面的示例代码:

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数据类型的范围(-128127)。 我的样品是否正确?发生了什么?有两个补码操作吗?我不明白这种行为。

6 个答案:

答案 0 :(得分:12)

因为一个字节只能容纳-128到127,所以这是溢出的预期行为

查看this loop

for(int index = 0 ; index < 258 ; index ++ ){
  System.out.println((byte)index);
}

number line

另见

答案 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 ..这就是我所理解的......我希望它清楚......