On Wed, Apr 22, 2009 at 08:20:22AM +1000, matthew green wrote:
In many places we use 'int' for flags.
Also in most places, the flag is checked this way:
if (flags & FLAGX)
do_something();
This is problematic when the top-most bit is used.
i'm curious what the actual problem is here. afaict, the
code generated for the above test is the same no matter
the type of 'flags', on several platforms.
If FLAGX is the msb this might be (1 << 31), (1u << 31), 0x80000000 or
0x80000000u I think the compiler might object to the first - but the
other 3 are all unsigned (on a 32bit arch).
'int_var & unsigned_var' will implicitly cast the int to unsigned - which
is (at least for 2s compiliment systems) defined to copy the bit-pattern
over. So this will DTRT.
So the only plausible problem is if the compiler saturates the (1 << 31)
calculation generating ((1 << 31) - 1). I don't think gcc ever does this!