В вашем конкретном случае вы можете написать:
union RSI_t
{
int RSI;
int ESI : 5;
int SI : 4;
int SIL : 3;
};
Хотя это не переносимо, так как оно опирается на определенные реализацией конструкции.
Вот более интересный пример:
#include <stdint.h>
union RAX_t
{
uint64_t RAX;
uint32_t EAX;
uint16_t AX;
struct {
uint8_t AL;
uint8_t AH;
};
};
(предполагается, что машина с прямым порядком байтов.)