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];
我正在使用 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];