Let consider the following program test.c
:
#include
struct test {
unsigned int a:5;
};
int main () {
unsigned int i;
s
Integer promotions are applied to the operands of shift covered in the draft C99 standard section 6.5.7
Bitwise shift operators paragraph 3 which says (emphasis mine going forward):
The integer promotions are performed on each of the operands.[...]
and the integer promotion of a bit-field is covered in section 6.3.1.1
Boolean, characters, and integers paragraph 2 which says:
The following may be used in an expression wherever an int or unsigned int may be used:
and contains the following bullet:
— A bit-field of type _Bool, int, signed int, or unsigned int.
and then says:
If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions.48) All other types are unchanged by the integer promotions.
it was clarified in the draft C11 standard:
If an int can represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions.58) All other types are unchanged by the integer promotions.
So this is expected behavior.