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 anSHRL
und das Intel-Anweisungsdokument für SHRL, dasres
ist nicht NULL.
Bedeutet das, dass GCC das Standardverhalten auf der Intel-Plattform nicht implementiert?