2个字节转short,我是这样处理的
1、int a = (byte[0]<<8) | byte[1],结果有问题 当收到的byte[1]是负数,比如-128,a的结果就成了负数,请问为什么?符号位应该是不是1啊。 2、为什么-128&oxff  就会等于+128,与得结果符号位是1啊,为什么是整数。       

解决方案 »

  1.   

    1.int a=(byte[0]<<8)|(byte[1]&0xff)
      

  2.   

    -128
    -->原码:10000000 00000000 00000001 00000000
    -->反码:11111111 11111111 11111110 11111111
    -->补码:11111111 11111111 11111111 00000000
    -128&0xf
     11111111 11111111 11111111 00000000
    &00000000 00000000 00000000 11111111
    -------------------------------------
     00000000 00000000 00000000 00000000
    结果是0吧
      

  3.   

    一个byte数只有8位,这个数参与运算(+,-,*,/,位运算等)时,要转这int来参与运算。增加的高位字节全要用byte的符号位填冲,这个就符号位扩展。
      

  4.   

    -128的原码应该是10000000吧,那么他在进行位运算时,会转成int是多少啊? 
    是00000000 00000000 00000000 10000000 啊 我觉得  
    为什么你说是 10000000 00000000 00000001 00000000 请解释一下好吗
      

  5.   

    是的我弄错了.
    对不起,搞错了一位.
    -128 
    -->原码:10000000 00000000 00000000 10000000 
    -->反码:11111111 11111111 11111111 01111111 
    -->补码:11111111 11111111 11111111 10000000 
    -128&0xf 
     11111111 11111111 11111111 10000000
    &00000000 00000000 00000000 11111111
    -------------------------------------
     00000000 00000000 00000000 10000000结果是128
    一个byte数只有8位,这个数参与运算(+,-,*,/,位运算等)时,要转为int来参与运算。增加的高位字节全要用byte的符号位填冲,这个就叫符号位扩展。
      

  6.   

    受益匪浅,还有一问题,0xff为什么不会被符号位拓展,而byte型变量就会?
      

  7.   

    最高的一位是符号位,正数为0,负数为1.
    所以
    -128 
    -->原码:10000000 00000000 00000000 10000000 原码转为反码就是除了符号位(最高位),其它余各位按位取反.->反码:11111111 11111111 11111111 01111111 反码转为补码,就是反码加1.-->补码:11111111 11111111 11111111 10000000 
      

  8.   

    0xff相当于0x000000ff,高位的0省略了,没有写出来.就像日常中,00012写为12一样.