Cedric Roux wrote: > > If that is what you refer to: > 3 An rvalue for an integral bit-field (_class.bit_) can be converted to > an rvalue of type int if int can represent all the values of the bit- > field; otherwise, it can be converted to unsigned int if unsigned int > can represent all the values of the bit-field. If the bit-field is > larger yet, no integral promotion applies to it. If the bit-field has > an enumerated type, it is treated as any other value of that type for > promotion purposes. > (found on the internet, I don't have the standard) > > we can understand that "t" may be promoted to "int" (which is 32b) because > it occupies 16 bits. And the << arithmetic operator asks for the > promotion. > > Maybe that's why you have 0. > Maybe that's the way it has to be and gcc 4.0.2 was wrong. Your citation applies, but my interpretation differs: In C++ a bit-field has the declared type; the number of bits is not part of its type [1][2]. The C++ integer promotion rules apply [your citation above]; in particular the clause: "If the bit-field is larger yet, no integral promotion applies to it". A bit-field expression of declared type long is unchanged by integer promotions, since (the number of bits in the bit-field being irrelevant) long is larger than int and unsigned int. So the expected output is: 100000000 200000000 100000000 8000 100000000 8000 [1] ISO/IEC 14882-1998 [class.bit] The bit-field attribute is not part of the type of the class member. [2] C++ Standard Core Language Issue #303 (http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_closed.html#303) > > Note that doing: > printf("%lx %lx %lx\n", (T)t.f, (T)((unsigned long)t.f << 17), > (T)(((unsigned long)t.f << 17) >> 17)); > prints what you wait (not 0) > (with a g++ 4.3.2, not even 4.4.1) Yes, we can cast, but the question is what is the correct behavior in the absence of a cast. I don't want to find all the places in existing code where a cast might be necessary, if 4.4.1 behavior is a bug. -- Vineet