负数在BYTE中是如何编码的?

解决方案 »

  1.   

    byte: -128~127
    int:  -2147483648~2147483647
    short: -32768~32767
    long: -92233720368477808L~92233720368477807L
    float: -+3.40282347E+38F
    double: -+1.797693134862317E+308D
      

  2.   

    BYTE是8位,所以2^8-1=255
    为了表示负数,用最高为表示正负,因而剩下7位表示大小--2^7-1=127
    在java里面好像没有unsigned这个关键字,要不就用int去记录,要不就用byte去记录,但是你自己知道具体存放的值到底表示什么意思就行啦。
      

  3.   

    不好弄啊。现在我是要在另外一个C程序里接收这个byte的值,而且只能用BYTE。
    现在我是用这个值-128来做,但还是有问题。
    比如200,我肯定要200-128=72这样来处理,但若是值为57,那57-128=-71,值传到我的C程序后,我收到的值再+128来还原。这样就有问题了。看看大家能不能解决?
    说到底我这样做的目的就是要把四位数的年份,比如“2003”,用两个byte来存储,这里涉及到位操作。分解完后,通过网络传到我的C程序,C程序这边用两个unsigned char来放这两个BYTE的值,这样,两个UNSIGNED CHAR值合并后,还原成原来的2003。
    看明白了么?在线探讨。我看其实主要是编码的问题。
      

  4.   

    如果仅仅解决你的问题倒有一个方法,就是利用网络字节序-高字节在前低字节在后。
    我的想法是由于java都是高字节在前,低字节在后,你用一个short存储年份(2个byte)
    然后通过socket直接write出去,c程序用2个unsigned char来读取。保证高位在前,低位在后。
    这样在java那里的各种运算都及其方便,不过我没时间测试,不知道可不可行。错了请见谅!:)
      

  5.   

    如果要解决你的问题,那么建议用short,可以把数据交叉一下。
    转换函数:/******shortTobyte****************************/
    //低位
    public byte lowBit(short num)
    {
    return (byte)(num&0x00ff);
    }
    //高位
    public byte hiBit(short num)
    {
    return (byte)(num>>8);
    }
    //组合
    public short combine(byte lowBit, byte hiBit)
    {
    return (short)(lowBit+ (hiBit<<8));
    }/************************************************/