Vinod kumar
Vinod kumar

Reputation: 67

32-Bit variable shifting in 8-bit MCU

I'm using 32-bit variable for storing 4 8-bit values into one 32-bit value.

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

cmd is of unsigned char type with data

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

However when 32-bit variable is printed I'm getting 0xFFFFBBCC.

Architecture- 8-bit AVR Xmega

Language- C

Can anyone figure out where I'm going wrong.

Upvotes: 0

Views: 1252

Answers (2)

ivand58
ivand58

Reputation: 811

That is because you are trying to shift value in 8 bit container (unsigned char) and get a 32 bit. The 8-bit value will be expanded to int (16 bit), but this is still not enough. You can solve the issue in many ways, one of them for e.g. could be by using the destination variable as accumulator.

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];

Upvotes: 0

user2371524
user2371524

Reputation:

Your architecture uses 16bit int, so shifting by 16 places is undefined. Cast your cmd[9] to a wider type, e.g. (uint32_t)cmd[9] << 16 should work.

You should also apply this cast to the other components: When you shift cmd[10] by 8 places, you could shift into the sign-bit of the 16bit signed int your operands are automatically promoted to, leading to more strange/undefined behavior.

Upvotes: 5

Related Questions