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

Java 字节类型行为不是预期的,java,types,byte,bitwise-operators,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 + " "); } } } 类Test3{ 公共静态void main(字符串[]args){ 字节

在本例中:

class Test3 {
    public static void main(String[] args) {
        byte mask = 1;
        for(mask <<= 7; mask != 0; mask >>>= 1) {
            System.out.print(mask + " ");
        }
    }
}
类Test3{
公共静态void main(字符串[]args){
字节掩码=1;
对于(掩码>=1){
系统输出打印(掩码+“”);
}
}
}

我希望输出是-128643216168421,但是我收到了一个无限递归循环-1。如果我将掩码变量的类型更改为int,则程序将正常运行。你能解释一下为什么我有这个特殊的输出吗?提前感谢您抽出时间来帮助我

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

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

0x0001
这一转变是:

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

0x80 == 100000000 == -128
现在将字节值1向右移动,首先将字节转换为整数:

0xff80
然后将0移位到最高有效位(位置31),结果:

0x7fc0
0xc0 == 11000000 == -64
通过将int值转换回一个字节会删除最高字节,结果如下:

0x7fc0
0xc0 == 11000000 == -64
这个连续的til是字节值

0xff == 11111111 == -1

而且永远不会结束。

这里没有递归,你的意思是无限循环。实际上,它开始时就像
-128-64-32-16-8-4-2-1-1-1…
@Maroun是的,无限循环是我的意思,谢谢你纠正我。而且
掩码>>=1
掩码>=1
,这很奇怪。至于原因,我也想知道。谷歌搜索了原因:
byte
在操作前被提升为
int
。请看这里:。非常感谢您的详细解释!