Ist die Verschiebung nach rechts undefiniert, wenn die Anzahl größer als die Breite des Typs ist?

Ich habe gerade nachgesehenC ++ Standard. Es scheint, dass der folgende Code NICHT sein sollteundefiniertes Verhalten:

unsigned int val = 0x0FFFFFFF;
unsigned int res = val >> 34;  // res should be 0 by C++ standard,
                               // but GCC gives warning and res is 67108863

Und vom Standard:

Der Wert von E1 >> E2 ist E1 rechtsverschobene E2-Bitpositionen.Wenn E1 einen vorzeichenlosen Typ hat oder wenn E1 einen vorzeichenbehafteten Typ und einen nicht negativen Wert hat, ist der Wert des Ergebnisses der integrale Bestandteil des Quotienten von E1 / 2 ^ E2. Wenn E1 einen vorzeichenbehafteten Typ und einen negativen Wert hat, ist der resultierende Wert implementierungsdefiniert.

Nach der Norm ist die Variable, da 34 KEINE negative Zahl istres wird 0 sein.

GCC gibt die folgende Warnung für das Code-Snippet aus undres ist67108863:

Warnung: Anzahl der Verschiebungen nach rechts> = Breite des Typs

Ich habe auch den von GCC ausgegebenen Assembler-Code überprüft. Es ruft einfach anSHRLund das Intel-Anweisungsdokument für SHRL, dasres ist nicht NULL.

Bedeutet das, dass GCC das Standardverhalten auf der Intel-Plattform nicht implementiert?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage