In this case, the left shift doesn't even lose any bits, because the high bit is already zero (and it's a constant, so the compiler knows that). In fact, that's the whole point of the thing: to sign-extend the 31-bit value to 32 bits. I don't think it should complain about 0x7fffffff << 1.