byte right =0xf; // 00001111
System.out.println(Integer.toBinaryString(right)); // 00001111
right = (byte)(right << 4);
System.out.println(Integer.toBinaryString(right)); // 11111111111111111111111111110000
为什么right
等于11111111111111111111111111110000
?我明确地将它转换为byte = 8位。
我正在考虑输出:11110000
。
答案 0 :(得分:10)
如果你没有强制转换为byte
,那么一切都会好的。
没有为byte
定义的移位运算符,因此该值首先提升为int
- 这很好,仍然是0000 [...] 1111。
然后向左移动4位,给出0000 [...] 111000。
然后转换为byte
,给出一个11110000的字节。
然后调用Integer.toBinaryString
,其中包含int
参数。这意味着字节1111000被转换为int
- 此时它被符号扩展为11111111111111111111111111110000(根据JLS 5.1.2),然后打印出来。
选项:
byte
,因此您最终无法转换回int
。 (例如,使用int shifted = right << 4;
,然后将shifted
传递给Integer.toBinaryString
。)right & 0xff
来应用位掩码,而不是隐式转换,因此您只能 设置最后8位。其中任何一个都打印11110000。