我使用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
任何人都可以找出我出错的地方。
答案 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];