使用Java中的零填充运算符右移(>>>)仅使用“int”而非“byte”

时间:2017-01-16 09:28:20

标签: java int byte bit-shift zerofill

我用Java编写一个程序,使用零填充(>>>)运算符的右移。 对于以下程序,一切都很好。

class First
{
        public static void main(String[] args)
        {
                int b = -1;
                int c = b>>>2;
                System.out.println(b);
                System.out.println(c);
        }
}

输出是:

-1
1073741823

上述计划中的一切都很好。但是如果我为byte编写相同的程序:

class First
{
        public static void main(String[] args)
        {
                byte b = -1;
                byte c = (byte)(b>>>2);
                System.out.println(b);
                System.out.println(c);
        }
}

输出是:

-1
-1

看起来像“>>”的工作运算符而不是“>>>”。我的预期输出是:

-1
63 

请解释背后的概念。

1 个答案:

答案 0 :(得分:0)

在每次操作之前,Java将byte,short或char操作数(变量或常量)转换为int。然后执行操作。

byte b = 2, c = 3;
byte d = b * c; //Compilation error

在乘法运算之前,b和c都在int中转换。所以结果是int。我们试图在字节d中存储int,这会导致编译错误。

移位运营商也是如此。

int c = b>>>2;

首先b转换为int。然后使用int进行移位操作。最终结果是一个int。正如大卫华莱士所说的那样:"所以零点最终比一个字节的两个前导位更加重要。#/ p>