理解浮动的两个补码(德州仪器传感器标签)

时间:2015-01-29 20:43:39

标签: python floating-point sensor twos-complement texas-instruments

我找到了一些示例代码,用于从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转换为float。为什么?我不明白这一点。

德州仪器的示例代码可在此处找到: 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;
}

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

2 个答案:

答案 0 :(得分:2)

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

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

如何?好吧,如果值超过0x7fff,我们就知道应该为负数,而负值则存储为two's complement。因此,我们只需从中减去0x10000,我们就会得到负值。

答案 1 :(得分:1)

所以你要在有符号的十六进制和浮点数之间进行转换。在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