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

2022-09-01 18:36:38

考虑以下 Java 代码片段

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

输出:

c=0xff
d=0xff

预期输出:

c=0x0f

如何?作为二进制中b后无符号右移,因此,但为什么它是如何的?1111 00010000 11110x0f0xff


答案 1

问题在于,在 shift 操作发生之前,所有参数都首先提升到:int

byte b = (byte) 0xf1;

b是有符号的,因此其值为 -15。

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

b首先将符号扩展到整数,然后向右移动到,然后由强制转换为 。-15 = 0xfffffff10xffffffff0xffbyte

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

b首先将符号扩展到整数,然后向右移动到,然后由强制转换为 。-15 = 0xfffffff10x0fffffff0xffbyte

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


答案 2

我猜这是在转移之前延伸的标志。bint

因此,这可能按预期工作:

(byte)((0x000000FF & b)>>4)

推荐