8 位 MCU 中的 32 位变量移位

32-Bit variable shifting in 8-bit MCU

我正在使用 32 位变量将 4 个 8 位值存储到一个 32 位值中。

32_bit_buf[0]= cmd[9]<<16 | cmd[10]<<8| cmd[11] <<0;

cmd为unsigned char类型,数据为

cmd [9]=AA
cmd[10]=BB
cmd[11]=CC

然而,当打印 32 位变量时,我得到 0xFFFFBBCC

架构 - 8 位 AVR Xmega

语言- C

任何人都可以找出我哪里出错了。

您的架构使用 16 位 int,因此未定义移动 16 位。将您的 cmd[9] 转换为更广泛的类型,例如(uint32_t)cmd[9] << 16 应该可以。

您还应该将此转换应用于其他组件:当您将 cmd[10] 移动 8 个位置时,您可以移动到 16 位 signed 的符号位int 您的操作数会自动提升为,从而导致更多 strange/undefined 行为。

那是因为您试图将 8 位容器(unsigned char)中的值移位并获得 32 位。 8 位值将扩展为 int(16 位),但这仍然不够。您可以通过多种方式解决问题,其中之一是例如可以通过使用目标变量作为累加器。

32_bit_buf[0] = cmd[9];
32_bit_buf[0] <<= 8;
32_bit_buf[0] |= cmd[10];
32_bit_buf[0] <<= 8;
32_bit_buf[0] |= cmd[11];