0xffffffff << 0 is 0xffffffff
0xffffffff << 1 is 0xfffffffe
..
0xffffffff << 30 is 0xc0000000
0xffffffff << 31 is 0x80000000
It is defined to ignore overflow. Therefore, I claim that there's enough consistency here that we can extend the pattern to this: 0xffffffff << 32 is 0x00000000
I claim this really is the mathematically correct answer. It's consistent with the most obvious pattern, and there are no other relevant patterns.C has chosen to call this undefined behavior instead of returning the correct answer here, and I call that choosing optimization over correctness.