我正在使用pic从传感器读取值,并且我接收传感器范围之外的值。我认为这可能是一个转换问题。 这是我正在使用的代码:
long readvalue=(long)((i2coctetlist[0] << 8) | (i2coctetlist[1]));
这是一个例子:
收到的2个字节:01111111 11001101,结果:32717
我的代码中是否有错误?
由于
答案 0 :(得分:0)
原因是Java中的所有类型都已签名,并且在转换为更宽类型时会对值进行符号扩展。对于显式强制转换((long)
)和由于操作而自动转换(x<<y
至少将x
转换为int
,x|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;