public void putShort(short vol)
{
conData[inc++] = (byte)(vol);
conData[inc++] = (byte)(vol >>> 8 );
} public short getShort()
{
return (short)((conData[inc++] & 0xff)+((conData[inc++] & 0xff) << 8));
}上面的代码是别人的,大概意思是把16位的short 分两为放到8位的byte里吧。 
  低8位直接放入byte(这里是不是直接丢弃了高8位呢,他是默认直接取低8位放入byte 里吗)
  高8位无符号向右移8位   
getShort 的时候 用到了 <<8  这里好像是有符号 移位吧  那最高位岂不是成了符号位了吗? 那它的值是不是要改变了呢最后 & 0xff  这里  好像和没有用没什么差别吧
 以上是小弟的理解。 望大虾们更正下 ,,,谢谢 !!

解决方案 »

  1.   

    最后和ff做与运算就是为了抵消掉java隐藏的符号位扩展 
      

  2.   

    是默认直接取低8位放入byte。
      

  3.   

    1楼正解,改造了一下你的代码:
    public class Test {  static byte[] conData = new byte[2];  public static void main(String[] args) throws Exception {
        putShort((short) 128);
        System.out.println(getShort());
        System.out.println(getShort2());
      }  public static void putShort(short vol) {
        conData[0] = (byte) (vol);
        conData[1] = (byte) (vol >>> 8);
      }  public static short getShort() {
        return (short) ((conData[0] & 0xff) + ((conData[1] & 0xff) << 8));
      }  public static short getShort2() {
        return (short) ((conData[0]) + ((conData[1]) << 8));
      }
    }
    java没有unsigned,
    128(10) = 0000 0000 1000 0000(2)
    conData[0] = 0;
    conData[1] = 1000 0000(2) = -128(10)
    -128 << 8 = 1000 0000(2) = -128(10)(<<操作,符号位不变)
    getShort2=0+(-128)=-128,
    所以,需要&0xFF,保证取到的是无符号
      

  4.   


    笔误吧!  conData[0]=-128【10】 = 10000000【2】
              conData[1]=0【10】= 00000000【2】
      

  5.   


    说的很正确,这里补充一些:byte b=(byte)128;  结果大家都知道b=-128[10] 即10000000[2]。
    这是因为128(int型)的高位24个零全部被抹去了,留下低位的8位二进制码:10000000。java都是有符号整数的。所以10000000被表示成为了负数(最高位为1),采用取反+1的原则表示成10进制结果为-128。int i=(int)b;  结果大伙也清楚:既然b=-128,你们此时i=-128。
    没错,i会将b二进制码前面扩展出24个1(注意,不是扩展出0):11111111 11111111 11111111 10000000
    然后这个32位二进制码也表示一个负数,结果也是-128。那么问题来了,怎么样才能让byte b扩充成int型屏蔽掉符号那?
    答案只有一种,就是b & Oxff  注意Oxff也是int型的16为表示:00000000 00000000 00000000 11111111
    这下清楚了,和Oxff &运算的结果就是  00000000 00000000 00000000 10000000 表示整数128