[size=medium]
System.out.println("(byte)0xa7="+(byte)0xa7);
//结果是:-89.解释:0xa7=0000 0000 0000 0000 0000 0000 1010 0111 ,
//(byte)0xa7=1010 0111=-89
System.out.println("(byte)(0xa7>>>2)="+(byte)(0xa7>>>2));
//结果是:41.解释:0xa7>>>2=0000 0000 0000 0000 0000 0000 0010 1001=41,
//(byte)(0xa7>>>2) = 0010 1001=41
System.out.println("(byte)0xa7>>>2="+((int)((byte)0xa7>>>2)));
//结果是:1073741801.解释:(byte)0xa7>>>2 = -89>>>2=
//0011 1111 1111 1111 1111 1111 1110 1001 = 1073741801
//Java使用补码来表示二进制数,因此移位运算都是针对整型数的二进制补码进行。
System.out.println("(byte)0xa7>>>2="+((byte)((byte)0xa7>>>2)));
//结果是:-32.解释:(byte)0011 1111 1111 1111 1111 1111 1110 1001=
//1110 1001=-(0001 0111)=-23
System.out.println(Integer.toBinaryString((byte)0xa7>>>2));
//结果是:0011 1111 1111 1111 1111 1111 1110 1001
上面是我的分析,不知道是不是正解。
下面是恒叔的分析:
// TODO Auto-generated method stub
System.out.println((byte)0xa2>>>2);
//1073741800
System.out.println(Integer.toHexString((byte)0xa2));
//ffffffa2
System.out.println(Integer.toHexString((byte)127));
//0000007f
//由于162= (0xa2) 127 = (0x7f) 162大于 127 所以 0xa2转成byte时候溢出
//变成负数 负数在计算机内存中是补码形式存在 因此就是(byte)0xa2 = 0xffffffa2
//换算成二进制就是1111 1111 1111 1111 1111 1111 1010 0010
//不带符号右移2位就是
// 0011 1111 1111 1111 1111 1111 1110 1000
//这个时候0011 1111 1111 1111 1111 1111 1110 1000的最高位就不是1 是0 了 表示正数了
//然后你再把0011 1111 1111 1111 1111 1111 1110 1000变成十进制是多少 是不是 1073741800
注明:int = 4byte = 32bit
float = 4byte = 32bit
long = 8byte = 64bit
double = 8byte=64bit
short = 2byte = 16bit
char = 2byte = 16bit
byte = 8bit
System.out.println("(byte)0xa7="+(byte)0xa7);
//结果是:-89.解释:0xa7=0000 0000 0000 0000 0000 0000 1010 0111 ,
//(byte)0xa7=1010 0111=-89
System.out.println("(byte)(0xa7>>>2)="+(byte)(0xa7>>>2));
//结果是:41.解释:0xa7>>>2=0000 0000 0000 0000 0000 0000 0010 1001=41,
//(byte)(0xa7>>>2) = 0010 1001=41
System.out.println("(byte)0xa7>>>2="+((int)((byte)0xa7>>>2)));
//结果是:1073741801.解释:(byte)0xa7>>>2 = -89>>>2=
//0011 1111 1111 1111 1111 1111 1110 1001 = 1073741801
//Java使用补码来表示二进制数,因此移位运算都是针对整型数的二进制补码进行。
System.out.println("(byte)0xa7>>>2="+((byte)((byte)0xa7>>>2)));
//结果是:-32.解释:(byte)0011 1111 1111 1111 1111 1111 1110 1001=
//1110 1001=-(0001 0111)=-23
System.out.println(Integer.toBinaryString((byte)0xa7>>>2));
//结果是:0011 1111 1111 1111 1111 1111 1110 1001
上面是我的分析,不知道是不是正解。
下面是恒叔的分析:
// TODO Auto-generated method stub
System.out.println((byte)0xa2>>>2);
//1073741800
System.out.println(Integer.toHexString((byte)0xa2));
//ffffffa2
System.out.println(Integer.toHexString((byte)127));
//0000007f
//由于162= (0xa2) 127 = (0x7f) 162大于 127 所以 0xa2转成byte时候溢出
//变成负数 负数在计算机内存中是补码形式存在 因此就是(byte)0xa2 = 0xffffffa2
//换算成二进制就是1111 1111 1111 1111 1111 1111 1010 0010
//不带符号右移2位就是
// 0011 1111 1111 1111 1111 1111 1110 1000
//这个时候0011 1111 1111 1111 1111 1111 1110 1000的最高位就不是1 是0 了 表示正数了
//然后你再把0011 1111 1111 1111 1111 1111 1110 1000变成十进制是多少 是不是 1073741800
注明:int = 4byte = 32bit
float = 4byte = 32bit
long = 8byte = 64bit
double = 8byte=64bit
short = 2byte = 16bit
char = 2byte = 16bit
byte = 8bit