我的字节突然变为负数并倒数

时间:2013-07-05 07:20:35

标签: java for-loop byte

我有一些代码每次通过循环时都会将字节增加8位。 这一切都按预期进行,直到我达到120,然后我的数字突然变为负数。

代码:

byte b = 0;

for(int i = 0; i < 0x100; i += 8) {
    System.out.print(b + " ");
    b += 8;
}

输出:

  

0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 -128 -120 -112 -104 -96 -88 -80 -72 -64 -56 -48 -40 -32 -24 -16 - 8

我想看到的内容:

  

0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128 136 144 152 160 168 176 184 192 200 208 216 224 232 240 248 256

有没有人知道为什么它会在120后开始倒计时而不是上升到256?

4 个答案:

答案 0 :(得分:12)

  

有没有人知道为什么它会在120后开始倒计时而不是上升到256?

是。 Java字节是签名的 - 就这么简单。来自section 4.2.1 of the JLS

  

整数类型的值是以下范围内的整数:

     
      
  • 对于字节,从-128到127,包括
  •   
  • ...
  •   

将字节值显示为无符号的最简单方法是将其提升为int并使用0xff屏蔽它:

System.out.print((b & 0xff) + " ");

& operator会自动执行binary numeric promotion。)

答案 1 :(得分:3)

字节是从-128到+127的带符号数量。一旦达到127,它就会回到最低点。

答案 2 :(得分:3)

因为它不适合字节范围。 byte的范围是-128到+127。字节数据类型是 8位有符号二进制补码整数。它的最小值为-128,最大值为127(含)从JLS 4.2.1

  

对于字节,从-128到127,包括

因此,128中的值-128实际上是byte

答案 3 :(得分:0)

这是因为一个字节只能存储8位信息,即2 ^ 8 = 256个值,128个负数,零个和127个正数,并且它包含在内。如果需要最多256个,请使用int,否则如果内存使用很重要,请使用字节从-127到128计数。