了解浮点数的补码(德州仪器传感器标签)

Understanding Two's complement to float(Texas Instruments Sensor Tag)

我在 github 上找到了一些从德州仪器传感器标签中提取温度的示例代码: 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 转换为浮点数。为什么?我不明白这个。

德州仪器的示例代码可以在这里找到: http://processors.wiki.ti.com/index.php/SensorTag_User_Guide#SensorTag_Android_Development

为什么TI示例代码中这个函数中的return值除以128.0?

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

我确实向开发者询问过这个问题,但没有得到回复。

所以你在带符号的十六进制和浮点数之间进行转换。在 python 中,带符号的浮点数显示为负号,因此您可以忽略它在内存中的实际表示方式。但是在十六进制中,数字的负数部分表示为值的一部分。因此,要正确转换,请输入移位。

您可以使用 Python 解释器自己玩这个:

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

对比:

unsigned = lambda n: float(n)

查看此以了解更多信息:

http://www.swarthmore.edu/NatSci/echeeve1/Ref/BinaryMath/NumSys.html

在磁盘和内存中,整数以一定的位宽存储。现代 Python 的 ints 允许我们忽略大部分细节,因为它们可以神奇地扩展到任何必要的大小,但有时当我们从磁盘或其他系统获取值时,我们必须考虑如何它们实际上被存储了。

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

怎么样?那么,如果值大于 0x7fff,我们知道它 应该 为负数,负值存储为 two's complement。所以我们简单地从中减去0x10000,我们得到负值。