Python 理解两个';s浮子的补充(德州仪器传感器标签)
我在github上找到了一些从德州仪器传感器标签中提取温度的示例代码: 我不理解以下代码的作用:Python 理解两个';s浮子的补充(德州仪器传感器标签),python,floating-point,sensors,twos-complement,texas-instruments,Python,Floating Point,Sensors,Twos Complement,Texas Instruments,我在github上找到了一些从德州仪器传感器标签中提取温度的示例代码: 我不理解以下代码的作用: 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或更
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示例代码中此函数的返回值偏离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)
查看此项了解更多信息:
磁盘和内存中的整数存储到特定的位宽度。现代Python的
int
s允许我们忽略大部分细节,因为它们可以神奇地扩展到任何必要的大小,但有时当我们从磁盘或其他系统获取值时,我们必须考虑它们的实际存储方式
16位有符号整数的正值将存储在0x0001
-0x7fff
范围内,其负值将存储在0x8000
-0xffff
范围内。如果该值是以某种方式读取的,但尚未检查符号位(可能是无符号整数,或较长整数的一部分,或由两个字节组合而成),那么我们需要恢复符号
怎么做?如果值超过0x7fff,我们知道它应该是负值,负值存储为。因此,我们只需从中减去
0x10000
,就得到了负值。你有没有研究过浮动(0x8fff)和浮动(0x8fff-0x10000)之间的区别?线索就在名字到签名中!是的,我理解,但为什么只有当值大于0x7fff时才会转换为有符号?我理解你的意思,所以0x7fff和更小的十六进制值如果有两个字节,就永远不会是负数,因为msb不能是1(二进制中的7是0111)。因为0x7fff和更小的不是负数,我们不需要转换它?我理解正确了吗?正整数不是0x0001-0x7fff吗?@meesterpatt看起来我有个大脑屁,写的是7999而不是原来的7fff。史蒂夫把它修好了。