Hi, > struct fields { > long long unsigned f0:12; > long long unsigned f1:52; > } __attribute__((__packed__));
the C99 standard ISO/IEC 9899 forbids this type: 6.7.2.1 Structure and union specifiers 4 A bit-field shall have a type that is a qualified or unqualified version of _Bool, signed int, unsigned int, or some other implementation-defined type. The C standard simply does not promote the bit-field value to any type larger than int or unsigned int. GCC chooses to do the larger than int computations in an artificial 52-bit type, but it is a non-standard extension. And if you compile your example with -Wall you'll see the problem: gcc -m32 -O3 -Wall test.c test.c: In function 'main': test.c:17:21: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 2 has type 'int' [-Wformat=] printf("x.f0=0x%llx\n", x.f0); ^ test.c:19:21: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 2 has type 'long long unsigned int:52' [-Wformat=] printf("x.f1=0x%llx\n", x.f1); ^ so especially the first warning is no joke: ./a.out x.f0=0x80497b400000fff g0=0x1ffe expect 0x1ffe x.f1=0xfffffffffffff g1=0xffffffffffffe expect 0x1ffffffffffffe OTOH that is perfectly OK for C++: gcc -x c++ -m32 -O3 -Wall test.c ./a.out x.f0=0xfff g0=0x1ffe expect 0x1ffe x.f1=0xfffffffffffff g1=0x1ffffffffffffe expect 0x1ffffffffffffe Regards Bernd.