我在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)嗯......有人可以解释我是怎么得到错误的结果的吗...... ??
谢谢......: - )
答案 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