I have defined a structure like this, struct CONTROL_MSG_HDR { unsigned T :1; unsigned L :1; unsigned X1 :2; unsigned S :1; unsigned X2:7; unsigned Ver:4; unsigned short Length; unsigned int Id; unsigned short Ns; unsigned short Nr; }; As evident from the definition, fields T, L and S are boolean fields while field Ver is a 4 bit field which can take maximum value of 0xF. Now when I assign values other then 0 and 1 to T, L or S field the compiler throws a warning, bitfields.c:37: warning: large integer implicitly truncated to unsigned type Ditto for Ver field also. But while wrap up of T, L or S field is '0' when values other than 0 and 1 are assigned, the wrap up value of Ver is 0x1, if any value greater than 0xF is assigned. See the code snippet below and the output, int main(int argc, char *argv[]) { struct CONTROL_MSG_HDR hdr; hdr.T = 1; hdr.L = 2; hdr.Ver=17; printf ("sizeof b = %d\n", sizeof(hdr)); printf ("T=%u, L=%u, ver=0x%x\n", hdr.T, hdr.L, hdr.Ver); return 0; } C:\c-prog>gcc -o bitfields.exe bitfields.c bitfields.c: In function 'main': bitfields.c:36: warning: large integer implicitly truncated to unsigned type bitfields.c:37: warning: large integer implicitly truncated to unsigned type C:\c-prog>bitfields.exe sizeof b = 12 T=1, L=0, ver=0x1 Could anyone pls explain to me this behavior ? -- Best Regards, Akshay, http://akshay.emurse.com/