2

我用 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

在上面的程序中一切都很好。但是如果我为字节编写相同的程序:

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 

请解释其背后的概念。

4

1 回答 1

0

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

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

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

移位运算符也会发生同样的事情。

int c = b>>>2;

首先 b 被转换为 int。然后使用 int 进行移位操作。最终结果是一个 int。正如大卫华莱士所说:“所以零最终比一个字节的两个前导位更重要”。

于 2017-01-21T04:24:33.670 回答