2的补码,字节到int给出高值

时间:2016-07-01 11:24:36

标签: binary hex

我正在使用pic从传感器读取值,并且我接收传感器范围之外的值。我认为这可能是一个转换问题。 这是我正在使用的代码:

long readvalue=(long)((i2coctetlist[0] << 8) | (i2coctetlist[1]));

这是一个例子:

  

收到的2个字节:01111111 11001101,结果:32717

我的代码中是否有错误?

由于

1 个答案:

答案 0 :(得分:0)

原因是Java中的所有类型都已签名,并且在转换为更宽类型时会对值进行符号扩展。对于显式强制转换((long))和由于操作而自动转换(x<<y至少将x转换为intx|y - 操作数相同首先转换为至少int)。

由于此(0x00<<8)|(0xf0)结果导致0xfffffff0,因为第二个(实际上是两个)操作数首先转换为0xfffffff0并执行|操作。

解决方案是始终使用转换为0xff的字节int进行掩码,然后应用字节掩码:

 int readValue = (byte0&0xff)|((byte1&0xff)<<8)|...
 // if needed, conversion to long should also mask 32 bits
 long longValue = readValue&0xffffffffL;