java中左移位的错误结果

java中左移位的错误结果,java,Java,我用java做了一个变量,字节a=0xA6//10100110 然后我做了这个: System.out.println(Integer.toHexString( ((short)a<<8)&0xFFFF )); System.out.println(Integer.toHexString)((短)a字节值A6表示负数(字节用Java签名)。当您转换为short时,它将符号扩展为FFA6。此外,移位操作是以整数值执行的,因此它再次符号扩展为ffffa6。左移三位得到FFFFF

我用java做了一个变量,
字节a=0xA6//10100110
然后我做了这个:

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

System.out.println(Integer.toHexString)((短)a字节值
A6
表示负数(字节用Java签名)。当您转换为
short
时,它将符号扩展为
FFA6
。此外,移位操作是以整数值执行的,因此它再次符号扩展为
ffffa6
。左移三位得到
FFFFFD30
,取下16位得到
0000FD30


如果移位8位,这并不重要,因为您将移位并屏蔽额外的1位。

当您声明初始化字节变量时,必须将其从整数向下转换:

byte a = (byte) 0xA6;
所以,你得到的不是10100110,而是1111111111110100110

而且,因为这个左移是这样工作的:

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

((短)请演示如何准确初始化变量。在这个问题上需要更多帮助吗?如果不需要,您可以将答案标记为已接受并/或对其进行投票。Eeh…对不起,高,我已经尝试过投票,但我的声誉不足以支持:-)那么…嗯..我如何从一个只声明
a
as
inta=0xA6;
中得到正确的结果呢?我不能做as int,因为初始数据是byte。所以我必须转换成short:-)然后转换成short:)
short a=(short)0xA6;
谢谢你的解释。那么我应该做这个((short)a&0xff更好地使用
(a&0xff)
 ((short)a<<8)&0xFFFF 
 ((short)a<<3)&0xFFFF