En C++ comme en C, les changements sont limitées à la taille (en bits) de la valeur a changé. Par exemple, si unsigned int de 32 bits, puis un déplacement de plus de 31 n'est pas défini.
Dans la pratique, cela signifie que si le compilateur peut déterminer au moment de la compilation que le décalage est trop grand, il peut choisir de ne pas effectuer le déplacement à tous (en fait, il peut produire du code qui n'a à peu près tout, mais c'est une pratique courant résultat). Un autre résultat est que le 5 le moins significatif de bits de décalage sont utilisés, et le plus élevé de bits d'ordre sont ignorées; cela est dû au compilateur produisant une instruction machine qui ne fait que cela (par exemple SHR sur l'architecture x86).
Références:
Pour C, N1570 section 6.5.7:
Si la valeur de l'opérande de droite est négatif ou supérieur ou
égale à la largeur de la promotion opérande de gauche, le comportement est
undefined.
Pour C++, N3690 la section 5.8, "[expr.maj]":
Le comportement est indéfini si l'opérande de droite est négatif, ou plus
inférieure ou égale à la longueur en bits de l'promu opérande de gauche.
N1570 est un projet, presque identique à la sortie de l'ISO C11 standard; cette clause a été à peu près la même depuis 1989, dans le C ANSI standard.
N3690 est un récent projet de la norme C++, je ne suis pas sûr de savoir si c'est le meilleur à utiliser, mais encore une fois, cette clause n'a pas changé.