计算机内部使用补码存放数值,移位运算均在 补码的基础上进行移位:为什么使用补码参见:http://www.cnblogs.com/dolphin0520/archive/2012/10/09/2711768.html

1、数值类型转换原则:如果最初的数值类型是有符号的,那么就执行符号扩展;如果是char类型,那么不管它要被转换成什么类型,都执行零扩展。如果目标类型的长度小于源类型的长度,则直接截取目标类型的长度。

2、移位运算分为有符号移位(>>、<<)和无符号移位(>>>、<<<):

     针对有符号类型的数值(byte、short、int、long),有符号向右移位时,左侧自动补上符号位,无符号向右移位时,则自动补0。

     针对无符号数值类型 (char),向右移位则补0。

             所有左移操作,右侧则都补0。

3、对于char、byte、short类型数值,在移位前会先行转换为整形,然后进行移位。

4、移位 操作符和赋值符合并(比如>>=、<<=、>>>=、<<<=),该 操作符直接将移位后的值赋予源数据本身,如果涉及类型转换,则自动进行。比如short  s = 1;  s <<= 2;   s向右移动两位后的整型结果自动转换为 short类型。

5、单纯移位操作并不会改变数值本身的值。

//无符号数 右移位,自动补0
char c = 65535; System.out.println("c=" + Integer.toBinaryString(c)); c>>=1; System.out.println("c=" + Integer.toBinaryString(c)); System.out.println("c=" + (c + 0));

 输出结果:

c=1111111111111111
c=111111111111111
c=32767

  

byte b = -1;
System.out.println("b=" + Integer.toBinaryString(b));
int x = b >>> 1;
System.out.println("b=" + Integer.toBinaryString(b));//b的值未改变
System.out.println("x=" + Integer.toBinaryString(x));
System.out.println("x=" + x);

  输出结果:

b=11111111111111111111111111111111
b=11111111111111111111111111111111
x=1111111111111111111111111111111
x=2147483647
byte b=-1;
b>>=25;
System.out.println("b=" + Integer.toBinaryString(b));//有符号移位,自动补充符号位,移位结果仍然位-1;
b>>>=24;
System.out.println("b=" + Integer.toBinaryString(b));//无符号移位,左侧自动补0,但整形截取为byte类型时,低8位仍然全为1,结构仍为-1;
b>>>=25;
System.out.println("b=" + Integer.toBinaryString(b));//当补0数到达低位一个字节时,数值发生改变。
System.out.println("b=" + b);

  输出结果:

b=11111111111111111111111111111111
b=11111111111111111111111111111111
b=1111111
b=127

  

 

posted on 2017-07-06 20:16  X-Man0  阅读(208)  评论(0)    收藏  举报