我用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
请解释背后的概念。
答案 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>