8位MCU中的32位可变移位

时间:2017-11-07 06:59:58

标签: c avr

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

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

cmd是带有数据的无符号字符类型

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

但是,当打印32位变量时,我得到了0xFFFFBBCC

架构--8位AVR Xmega

语言-C

任何人都可以找出我出错的地方。

2 个答案:

答案 0 :(得分:5)

您的架构使用16位int,因此未定义移位16位。将您的cmd[9]投射到更广泛的类型,例如(uint32_t)cmd[9] << 16应该有用。

您还应该将此演员阵容应用于其他组件:当您将cmd[10]移动8位时,您可以转移到16位签名 int的符号位您的操作数会自动提升,导致更奇怪/未定义的行为。

答案 1 :(得分:0)

那是因为你试图在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];