我有这段代码:
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)
,但它没有。我的假设是错的吗?
答案 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)
时,编译器会将b
从byte
转换为int
,并将(int)-1 == FFFFFFFFh == 11111111111111111111111111111111b
转换为第二次打印。变量int c
等于b>>>1
,因此第三次印刷有意义。