Как уже писали, компилятор не делает это как вздумается. У вас
всего лишь проблема с индейцами. Вот, например, класс для доступа к
полям регистра. При обращении к полю доступ напрямую, а если
обращение к регистру целиком (макросами теми же), то через
перегруженные операторы. В них индейцав можно поменять командой
RBIT. Но вообще, плохая идея. Лучше макросы под правильных индейцев
переписать и выкинуть их, ибо макросы зло. struct GRXSTSP
{
union
{
uint32_t x;
struct {
uint32_t epnum : 4;
uint32_t bcnt : 11;
uint32_t dpid : 2;
GRXSTSP_PKTSTS pktsts : 4;
uint32_t frmnum : 4;
uint32_t reserved : 7;
};
};
inline GRXSTSP operator = (uint32_t data) { this->x=data; return *this; }
inline GRXSTSP(uint32_t data) { x = data; }
};