字节类型的行为不是预期的

时间:2014-04-25 11:01:35

标签: java types byte bitwise-operators

在这个例子中:

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的无限递归循环。如果我将mask变量的类型更改为int,则程序行为正常。你能解释一下为什么我有这个特定的输出吗?提前感谢您抽出时间帮助我!

1 个答案:

答案 0 :(得分:3)

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

当您将字节值1向右移动七次时,您首先得到整数值:

0x0001

转移到:

0x0080

并通过删除最高字节转换回字节值:

0x80 == 100000000 == -128

现在将字节值1位置向右移动,首先将字节转换为整数:

0xff80

然后将0移到最高位(位置31),这导致:

0x7fc0

通过删除最高字节结果将int值转换回字节:

0xc0 == 11000000 == -64

这个连续直到字节值

0xff == 11111111 == -1

永远不会结束。