我找到了一些示例代码,用于从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;
}
我确实向开发者询问过这个问题,但没有得到答复。
答案 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