2014-04-25 21 views
3

在这个例子中:字节类型的行为是不是预期

class Test3 { 
    public static void main(String[] args) { 
     byte mask = 1; 
     for(mask <<= 7; mask != 0; mask >>>= 1) { 
      System.out.print(mask + " "); 
     } 
    } 
} 

我期待的输出为-128 64 32 16 8 4 2 1,相反,我接收到的无限 递归 环-1 。如果我将掩码变量的类型更改为int,则程序正常运行。你能解释一下为什么我有这个特殊的输出吗?提前感谢您的时间来帮助我!

+1

这里没有递归,你的意思是说无限循环。 – Maroun

+1

实际上,它开始像'-128 -64 -32 -16 -8 -4 -2 -1 -1 -1 ...'。 – Gassa

+0

@Maroun是无限循环是我的意思,谢谢你纠正我。 – ardavirus

回答

3

Java中的所有字节操作都是通过将字节转换为整数来完成的,当操作完成时,它将整数转换回字节。转换为一个字节只是从int中移除最高字节。因此,int值0xff00将被转换为字节值0x00。现在,你的例子:

当你1个七次转移字节值向右,你在第一时间获得整数值:

0x0001 

这是转向:

0x0080 

0x80 == 100000000 == -128 

现在你通过转移:

,并通过去除最高字节转换回字节值TE值1的位置的右​​侧,其中第一字节转换为整数:

0xff80 

,然后在0转移到这导致最显著位(位置31):

0x7fc0 

转换的int值回一个字节在去除最高字节结果:

0xc0 == 11000000 == -64 

这连续直到该字节值

0xff == 11111111 == -1 

并且永远不会结束。

+0

非常感谢您的详细解释! – ardavirus

相关问题