Behaviour of unsigned right shift applied to byte variable

Radheshyam Nayak picture Radheshyam Nayak · Oct 16, 2010 · Viewed 10.3k times · Source

Consider the following snip of java code

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

output:

c=0xff
d=0xff

expected output:

c=0x0f

how? as b in binary 1111 0001 after unsigned right shift 0000 1111 hence 0x0f but why is it 0xff how?

Answer

starblue picture starblue · Oct 16, 2010

The problem is that all arguments are first promoted to int before the shift operation takes place:

byte b = (byte) 0xf1;

b is signed, so its value is -15.

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

b is first sign-extended to the integer -15 = 0xfffffff1, then shifted right to 0xffffffff and truncated to 0xff by the cast to byte.

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

b is first sign-extended to the integer -15 = 0xfffffff1, then shifted right to 0x0fffffff and truncated to 0xff by the cast to byte.

You can do (b & 0xff) >>> 4 to get the desired effect.