2

我编写了以下示例代码:

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)。我的样本是否正确?发生了什么?有二进制补码运算吗?我不明白这种行为。

4

6 回答 6

12

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

检查这个循环

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

数线

另见

于 2012-06-25T05:45:40.220 回答
4

这是因为字节范围。一个字节只能存储从 -128 到 127 的值。

于 2012-06-25T05:46:52.407 回答
1

您将看到缩小原始转换的效果:将整数文字转换128byte除最后一个字节外的所有结果。整数的最后一个字节具有 value 10000000,当在二进制补码中解释 为单字节值时,它会输出-128.

相反,相同的值被解释为在左边用零填充的四字节值,即00000000 00000000 00000000 10000000等于128

于 2012-06-25T05:51:18.803 回答
1

来自关于原始数据类型的官方文档:

byte:byte 数据类型是一个 8 位有符号二进制补码整数。它的最小值为 -128,最大值为 127(含)。

回答您的问题:如何在 java 中设置大于 127 个 int 字节的变量?

表示无符号字节的最佳方法是使用有符号整数,因为 Java VM 将字节表示为 32 位,因此使用字节不会保存任何内容。

于 2012-06-25T05:48:39.577 回答
0

最后一个字节数是 127,第一个是 -128,所以当数字为 128 时,它变为 -128,当数字为 129 时,它变为 -127 .. 它继续直到再次达到 127,然后再次循环并变为 - 128 ..这就是我所理解的..我希望它清楚..

于 2013-11-05T11:39:06.067 回答
0

因为一个字节最多只能容纳 -128 到 127,所以当您转换大于 127 或小于 -127 的 int 时,java 编译器会自动进行更改。其实下面的说法

byte number_2 =  (byte) 128;

已更改为

byte number_2 =  (byte) -128;

使用 javap 检查字节码后,您会找到它。

于 2012-06-25T06:06:51.233 回答