Java位无符号移位(>>>)给出了奇怪的结果

时间:2014-03-16 09:55:34

标签: java byte-shifting

我有这段代码:

int i = 255;
byte b = (byte) i;
int c;
System.out.println(Integer.toBinaryString( i));
System.out.println("b = " + b); // b = -1
c=b>>>1;
System.out.println(Integer.toBinaryString( c));
System.out.println(c);

但我无法理解它是如何运作的。我认为无符号转移到255(11111111)应该会给我127(0111111),但它没有。我的假设是错的吗?

3 个答案:

答案 0 :(得分:2)

包括>>>在内的转移运算符在int上运行。 b的值-1因为byte已签名,在转变之前会提升为int。这就是你看到你看到的结果的原因。

255重新解释为-1的原因是255将其所有8位设置为1。当您将其分配给已签名的8位byte类型时,会根据two's complement规则将其解释为-1

答案 1 :(得分:1)

这是你如何获得预期结果

c = (0xFF & b) >>> 1;

有关详细信息,请参阅dasblinkenlight的答案

答案 2 :(得分:1)

试试这个,您就会明白:

System.out.println(Integer.toBinaryString(i)); // 11111111
System.out.println(Integer.toBinaryString(b)); // 11111111111111111111111111111111
System.out.println(Integer.toBinaryString(c)); // 1111111111111111111111111111111

变量int i等于255,因此第一次打印是有意义的。

变量byte b等于-1,因为您将255存储在一个字节中。

  • 但是,当您致电Integer.toBinaryString(b)时,编译器会将bbyte转换为int,并将(int)-1 == FFFFFFFFh == 11111111111111111111111111111111b转换为第二次打印。

变量int c等于b>>>1,因此第三次印刷有意义。