What does the C standard say about bitshifting more bits than the width of type?

Consider the following code:

int i = 3 << 65;

I would expect that the result is i==0, however the actual result is i==6. With some testing I found that with the following code:

int i, s;
int a = i << s;
int b = i << (s & 31);

the values of a and b are always the same.

Does the C standard say anything about shifting more than 32 bits (the width of type int) or is this unspecified behavior?


Solution 1:

From my WG12/N1124 draft (not the standard, but Good Enough For Me), there's the following block in 6.5.7 Bitwise shift operators:

If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined.

So, undefined. Be careful.