C语言 十六进制的12位2的补码(0DE和EDA)

bnlyeluc  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(98)

我在DPS 310压力传感器上使用STM32 F042 F4 P6,其中要校准温度,温度系数是要读取的(是12位2的补码),我成功地读取了系数c 0:0 DEc1:EDA.(参考DPS 310手册第14页)Datasheet
现在我需要取2的补码进行进一步的计算,在转换中会出现大量的混乱,即如果我将c 0转换为二进制并手动取2的补码,答案大约是3874(小数),但由于1个半字节都是0,如果我忽略它,我会得到34(小数)。虽然从不同的网站转换它给予各种其他的答案,我也尝试过人工智能,但这使事情变得更糟。如果我把0 DE转换成十进制和取2的补码答案是不同的,如果我直接从十六进制做答案是不同的。我知道2的补码的概念,但我不确定要考虑哪个值。
(0DE)h =(0000 1101 1110)2 ==>(1111 0010 0010)2 =(3874)10
但下面我附上了各种转换的截图:

网址:Image此处输出为(0010 0010)2 =(34)10
ChatGPT:Image在这里它给了我两个答案(1422)10和(454)10
Bing AI:Image这给出的答案为(598)10
Bard(Google AI):Image Which gave me(-1224 10

我很确定读取的十六进制系数c 0和c1的值,我用Arduino的默认库进行了验证,十六进制值分别为0 DE和EDA,但它们的2的补码分别为(222)10和(-294)10。我试着阅读各种帖子,我得到的只是对结果的困惑,有人能帮我找到真实的答案吗?

pes8fvy9

pes8fvy91#

使用ChatGPT和Google Bard等AI聊天机器人时要非常谨慎。这些是语言模型,旨在产生人类听起来不准确的信息文本。它们不是数学或逻辑模型。
大多数架构,包括Arduino,都使用二进制补码。你不需要把它转换成2的补码。根据你链接的文档,它已经这样存储了。如果您的架构使用了不同的东西,您只需要转换它。在这种情况下,你将从二的补码转换,而不是它。
但是,您确实需要进行符号扩展
,因为位长度不同。高阶位将以全零开始,或者其中有垃圾。对于二进制补码,这意味着查看原始的最高有效位并将其复制到新存储位置中的所有高阶位。

#include<stdio.h>

int extend12bit(int shorty)
{
        if (shorty & 0x800 ) //check MSB
                shorty = 0xFFFFF000 | shorty; //pad with 1s
        else
                shorty = 0x00000FFF & shorty; //pad with 0s
        return shorty;
}

void main()
{
        int foo = 0x0DE; //4 bytes = 32 bits
        foo = extend12bit(foo);
        printf("foo: %d\n",  foo);
        printf("foo physical: 0x%08X\n",  foo);

        int bar = 0xEDA;
        bar = extend12bit(bar);
        printf("bar %d\n",  bar);
        printf("bar physical: 0x%08X\n",  bar);
}

这会产生预期的值,并显示它们实际上是如何存储的,尽管有字节序。

foo: 222
foo physical: 0x000000DE
bar -294
bar physical: 0xFFFFFEDA

相关问题