小编典典

无符号右移应用于字节变量的行为

java

考虑以下Java代码片段

byte b=(byte) 0xf1;
byte c=(byte)(b>>4);
byte d=(byte) (b>>>4);

输出:

c=0xff
d=0xff

预期输出:

c=0x0f

怎么样?作为1111 0001 无符号右移后的二进制形式的b,0000 1111因此0x0f为什么0xff 呢?


阅读 223

收藏
2020-09-16

共1个答案

小编典典

问题在于,int在进行移位操作之前,所有参数都首先被提升为:

byte b = (byte) 0xf1;

b 已签名,因此其值为-15。

byte c = (byte) (b >> 4);

b首先将符号扩展为整数-15 = 0xfffffff1,然后向右移,0xffffffff并通过强制转换为截断0xffbyte

byte d = (byte) (b >>> 4);

b首先将符号扩展为整数-15 = 0xfffffff1,然后向右移,0x0fffffff并通过强制转换为截断0xffbyte

您可以做(b & 0xff) >>> 4以获得所需的效果。

2020-09-16