Problema de empaquetamiento de unión y estructura

Estoy escribiendo un software donde cada bit debe ser exacto (es para la CPU), por lo que __packed es muy importante.

typedef union{
uint32_t raw;
struct{
    unsigned int present:1;
    unsigned int rw:1;
    unsigned int user:1;
    unsigned int dirty:1;
    unsigned int free:7;
    unsigned int frame:20;
} __packed;
}__packed page_union_t;

esa es mi estructura y unión. Sin embargo, no funciona:

page_union_t p; //.....
//This:
p.frame=trg_page;
p.user=user;
p.rw=rw;
p.present=present;
//and this:
p.raw=trg_page<<12 | user<<2 | rw<<1 | present;

debería crear el mismo uint32. Pero no crean lo mismo.

¿Hay algo que no puedo ver que esté mal con mi sindicato?

Respuestas a la pregunta(10)

Su respuesta a la pregunta