Это из INCITS/ISO/IEC 9899-2011[2012], раздел 6.7.2 Type specifiers, пункт 5. Проверил в IAR, поле .i таки считается беззнаковым :)
struct{
int i:4;
unsigned int ui:4;
signed int si:4;
bool b:4;
} s;
s.i = -1;
s.ui = 0x0f;
s.si = -3;
s.b = -1; // а в поле .b заносятся биты 0001
printf(".i:%08x .ui:%08x .si:%08x .b:%08x\r\n", s.i, s.ui, s.si, s.b);
печатает
.i:0000000f .ui:0000000f .si:fffffffd .b:00000001
Дополнил:
printf("s:%08x\r\n", *(uint32_t*)&s );
печатает
s:00001dff