我在github上找到了一些示例代码来从Texas Instruments传感器标签中提取温度:
https://github.com/msaunby/ble-sensor-pi/blob/master/sensortag/sensor_calcs.py

我不明白以下代码的作用:

tosigned = lambda n: float(n-0x10000) if n>0x7fff else float(n)


我如何阅读以上代码:

if n>0x7fff: n = float(n-0x10000)
else n = float(n)


基本上发生的是将两者的补数(n)转换为浮点数。为什么仅当n的值大于0x7fff时才发生这种情况?如果值是0x7fff或更小,那么我们只是将i转换为float。为什么?我不明白

德州仪器(TI)的示例代码可在以下位置找到:
http://processors.wiki.ti.com/index.php/SensorTag_User_Guide#SensorTag_Android_Development

为什么在TI示例代码中的此函数中用128.0来指定返回值?

private double extractAmbientTemperature(BluetoothGattCharacteristic c) {
    int offset = 2;
    return shortUnsignedAtOffset(c, offset) / 128.0;
}


我确实向开发人员提出了此要求,但没有得到答复。

最佳答案

在磁盘和内存中,整数存储为特定的位宽。现代Python的int允许我们忽略大部分细节,因为它们可以神奇地扩展到所需的大小,但是有时当我们从磁盘或其他系统中获取值时,我们必须考虑它们的实际存储方式。

16位带符号整数的正值将存储在0x0001-0x7fff范围内,其负值将存储在0x8000-0xffff中。如果以某种尚未检查符号位的方式读取该值(可能是无符号整数,或者是较长整数的一部分,或者由两个字节组合而成),那么我们需要恢复符号。

怎么样?好吧,如果该值超过0x7fff,我们知道它应该为负,并且负值存储为two's complement。因此,我们只需从中减去0x10000即可得到负值。

10-04 15:04