应用于字节变量的无符号右移的行为
考虑以下 Java 代码片段
byte b=(byte) 0xf1;
byte c=(byte)(b>>4);
byte d=(byte) (b>>>4);
输出:
c=0xff
d=0xff
预期输出:
c=0x0f
如何?作为二进制中b后无符号右移,因此,但为什么它是如何的?1111 0001
0000 1111
0x0f
0xff
考虑以下 Java 代码片段
byte b=(byte) 0xf1;
byte c=(byte)(b>>4);
byte d=(byte) (b>>>4);
输出:
c=0xff
d=0xff
预期输出:
c=0x0f
如何?作为二进制中b后无符号右移,因此,但为什么它是如何的?1111 0001
0000 1111
0x0f
0xff
问题在于,在 shift 操作发生之前,所有参数都首先提升到:int
byte b = (byte) 0xf1;
b
是有符号的,因此其值为 -15。
byte c = (byte) (b >> 4);
b
首先将符号扩展到整数,然后向右移动到,然后由强制转换为 。-15 = 0xfffffff1
0xffffffff
0xff
byte
byte d = (byte) (b >>> 4);
b
首先将符号扩展到整数,然后向右移动到,然后由强制转换为 。-15 = 0xfffffff1
0x0fffffff
0xff
byte
您可以这样做以获得所需的效果。(b & 0xff) >>> 4
我猜这是在转移之前延伸的标志。b
int
因此,这可能按预期工作:
(byte)((0x000000FF & b)>>4)