将 8 位数据合并为 16 位,对于特定数字始终给出错误结果

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

我从传感器获取一些 8 位数据并尝试将其合并为 16 位。但我在 stm32 上的代码不适用于 0x63 和 0x91 值。除这些值外,所有其他值均有效。结果是 0x6291。是什么原因造成的? enter image description here

我尝试合并 0x63 和 0x91 并期望 0x6391 值,但我得到 0x6291。

merge hex stm32
2个回答
0
投票

AC4 也有同样意想不到的值,0x81f5 由 0x82 和 0xf5 组装而成。这是因为您使用了 int8_t,即 signed 8-bit 变量作为单个字节。对于 MSB=1(即负值)的字节,在通常的算术转换期间会扩展,因此在这种情况下,加法为 0xFFFF8200 + 0xFFFFFFF5 = FFFF81F5 然后转换为 uint16_t 作为 0x81F5。

在微控制器中,最好尽量避免使用有符号类型并坚持使用无符号类型,除非有充分理由的情况。

您可能已将字节数组声明为 char;在 C 中,char 的符号是实现定义的,因此除非将其用于字符或文本,否则不要使用普通 char。使用明确的无符号字符,或者更好的是 uint8_t。

JW


0
投票

在回答您的问题之前,我强烈建议您发布一段代码,以便我们可以运行它并为您纠正它,只是为了让事情变得简单。 现在回答你的问题: 1-它不仅仅发生在这两个值中,您可以检查 0x82 0xf5 只是 0x63 之前的值,它们发生了变化 2- 你正在使用“+”来添加2个十六进制值,你需要使用按位添加“|”而不是“+” 3-尝试在使用shift后使用掩码,例如:“(HexValue<<8)&0xff00"

© www.soinside.com 2019 - 2024. All rights reserved.