Hola, sí se puede, sólo que en potencias de dos. Digamos que quieres una variable que mida de 0 a 1023:
typedef struct uint10_tag
{
unsigned int var : 10;
}uint10_t;
El rango final es de 0 a (2^10 - 1) por ser sin signo.
Y la usas así:
uint10_t dato;
dato.var = 333;
Si le pusieras un valor mayor al que puede guardar entonces se trunca como cualquier otro downcasting que ya existe; por ejemplo si guardas 0xABCD en un uint8_t, te queda 0xCD.
Saludos.