java中左移的错误结果

时间:2014-06-27 09:57:08

标签: java

我在java中创建了一个变量,byte a = 0xA6; //10100110 然后我做了这个:

System.out.println(Integer.toHexString( ((short)a<<8)&0xFFFF ));

结果是0xA600。这是正确的结果。但是当我试着

System.out.println(Integer.toHexString( ((short)a<<3)&0xFFFF ));

预期结果应为:0x530(10100110000) 但是我得到了0xFD30(1111110100110000)嗯......有人可以解释我是怎么得到错误的结果的吗...... ??

谢谢......: - )

2 个答案:

答案 0 :(得分:1)

字节值A6表示负数(字节在Java中签名)。当您转换为short时,它会将符号扩展为FFA6。此外,移位操作以整数值执行,因此它再次符号扩展为FFFFFFA6。向左移三位给出FFFFFD30并取低16位给出0000FD30

如果你移位8位,这是无关紧要的,因为你移出并屏蔽了额外的1位。

答案 1 :(得分:0)

当你声明初始化字节变量时,你必须从整数下传它:

byte a = (byte) 0xA6;

所以,而不是10100110你有11111111111111111111111110100110。

而且,由于左移这种方式有效:

 ((short)a<<8)&0xFFFF 

返回1010011000000000

 ((short)a<<3)&0xFFFF 

返回1111110100110000