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

问题描述 投票:0回答:1

我正在使用STM32F042F4P6开发DPS310压力传感器,其中要校准温度,要读取温度系数(它是12位的2的补码),我成功读取了系数c0:0DEc1 :EDA。 (请参阅 DPS310 数据表第 14 页) Datasheet

现在我需要取 2 的补码进行进一步计算,转换过程中会出现大量混乱,即如果我将 c0 转换为二进制并手动取 2 的补码,答案约为 3874(十进制),但由于 1 半字节全为 0 ,如果我忽略它,我会得到 34(小数)。虽然从各个网站转换它给出了各种其他答案,但我也尝试过人工智能,但这让事情变得更糟。如果我将 0DE 转换为十进制并取 2 的补码答案是不同的,如果我直接从十六进制转换答案是不同的。我知道 2 的补码的概念,但我不确定要考虑哪个值。

(0DE)h = (0000 1101 1110)2 ==> (1111 0010 0010)2 = (3874)10

但下面我附上了各种转换的屏幕截图:

网站: Image 这里的输出是 (0010 0010)2 = (34)10

聊天GPT: Image 这里它给了我两个答案(1422)10&(454)10

必应人工智能: Image 答案为 (598)10

巴德(谷歌人工智能): Image 这给了我 (-1224)10

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

c++ c type-conversion hex
1个回答
0
投票

使用 ChatGPT 和 Google Bard 等人工智能聊天机器人时要非常谨慎。这些语言模型旨在生成听起来像人类的文本,而不是准确的信息。它们不是数学或逻辑模型。

大多数架构,包括 Arduino,都使用二进制补码。 您不需要将其转换为二进制补码。根据您链接的文档,它已经以这种方式存储了。仅当您的架构使用不同的东西时,您才需要转换它。在这种情况下,您将从补码转换,而不是转换为补码。

但是,您确实

需要进行符号扩展,因为位长度不同。高阶位要么以全零开头,要么包含垃圾。对于二进制补码,这意味着查看原始最高有效位并将其复制到新存储位置中的所有高阶位。

#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
    
© www.soinside.com 2019 - 2024. All rights reserved.