Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 理解两个';s浮子的补充(德州仪器传感器标签)_Python_Floating Point_Sensors_Twos Complement_Texas Instruments - Fatal编程技术网

Python 理解两个';s浮子的补充(德州仪器传感器标签)

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或更

我在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或更小,那么我们只需将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。史蒂夫把它修好了。