On some CPUs architectures, the operand size for some instructions could be larger than an `int`, in which case the upper part of a CPU register would become invalid on overflow instead of containing an extension of the sign bit.
There are also CPUs that do "saturating arithmetic" where overflow results in INT_MAX instead of wrapping.
Because the shift operations are arithmetically defined, and the situations that are undefined correspond to overflow. v << 1 means the same thing as v * 2 and is undefined if v * 2 is undefined.
There are also CPUs that do "saturating arithmetic" where overflow results in INT_MAX instead of wrapping.