了解浮点数的补码(德州仪器传感器标签)
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 的 int
s 允许我们忽略大部分细节,因为它们可以神奇地扩展到任何必要的大小,但有时当我们从磁盘或其他系统获取值时,我们必须考虑如何它们实际上被存储了。
16 位有符号整数的正值将存储在 0x0001
-0x7fff
范围内,其负值将存储在 0x8000
-0xffff
范围内。如果以某种尚未检查符号位的方式读取此值(可能是无符号整数,或较长整数的一部分,或由两个字节组装而成),那么我们需要恢复符号。
怎么样?那么,如果值大于 0x7fff
,我们知道它 应该 为负数,负值存储为 two's complement。所以我们简单地从中减去0x10000
,我们得到负值。
我在 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 的 int
s 允许我们忽略大部分细节,因为它们可以神奇地扩展到任何必要的大小,但有时当我们从磁盘或其他系统获取值时,我们必须考虑如何它们实际上被存储了。
16 位有符号整数的正值将存储在 0x0001
-0x7fff
范围内,其负值将存储在 0x8000
-0xffff
范围内。如果以某种尚未检查符号位的方式读取此值(可能是无符号整数,或较长整数的一部分,或由两个字节组装而成),那么我们需要恢复符号。
怎么样?那么,如果值大于 0x7fff
,我们知道它 应该 为负数,负值存储为 two's complement。所以我们简单地从中减去0x10000
,我们得到负值。