最近编程序,发现个问题,在字节数组里,大于0x80的数以补码的形式存储,负数也是补码。那如何区分他俩呢

解决方案 »

  1.   

    这个没法区分的吧,java的byte是带符号的,把>=0x80的byte转成short来存吧还是。
      

  2.   

    byte是有符号的,大于0x80的数用byte表示就是负数(因为高位就是符号位,高位是1表示负数),所以也就是用补码的形式存储
    如果要恢复成原码,可以转成比byte宽度更大的数据,如转成char或short,int等等
    for example
    byte b = (byte)0x80;
    System.out.printf("%d=0x%02x\n", b, b);
    char c = (char)(b & 0x00ff);
    System.out.printf("%d=0x%02x\n", (int)c, (int)c);
    short s = (short)(b & 0x00ff);
    System.out.printf("%d=0x%02x\n", s, s);
    int i = b & 0x00ff;
    System.out.printf("%d=0x%02x\n", i, i);
      

  3.   

    位操作转化为无符号的
    return 0x000000ff & a;
      

  4.   

    Java里面的数据类型都是有符号的。
    byte数据只能表示-128~127 256个数字。0x00~0x79表示正数,0x80~0xFF表示负数。。
    大于0x80的数?如果它是一个byte,那么它必然是一个负数。区分?区分啥呐?例如0x80,它在byte就是代表-128。。如果你想让它表示128,没问题啊,,数据类型转换。。int c = (0x80 & 0xff);
    //(c = 0x00000080)
      

  5.   

    这样一个字节那肯定没办法区分,要么byte变为int存储,要么增加一个flag。确定是高于海平线还是低于海平线...就算是一直高于海平线,你的最大高度才255,也满足不了需求啊...