The u8
field without a bit count is being aligned to the next byte boundary, rather than being packed with the other bit fields. Thus your first 4 bits take a byte, the second 8 bits take a byte, and the last 20 bits take 3 bytes, totaling 5.
If you add a bit field size to the 8 bit field it will work, see http://ideone.com/Bexw6l