8

In Java a bitwise operation causes type casting to integer and also causes sign extension. For instance the following is expected:

byte b = -1;
System.out.println(b >> 1);//-1

In Java chars are encoded in UTF-16 and each unit is represented with 2 bytes.

char c = 0xFFFF; //I assume now the sign bit is 1.
System.out.println(c >> 1);//32767 ???? WHY

I was expecting -1 instead of 32767. Why is the sign not extended during the type cast before the bitwise operation is applied? Any ideas?

CEGRD
  • 7,787
  • 5
  • 25
  • 35

2 Answers2

12

Because char is unsigned - 0xFFFF really has a value of 65535

Michael Borgwardt
  • 342,105
  • 78
  • 482
  • 720
3

It works like that because of widening primitive conversion that is performed on shift arguments. Namely there's no information loss, including the sign of the type being converted.

soulcheck
  • 36,297
  • 6
  • 91
  • 90