Die C99 spec Zustände:arithmetische Rechtsverschiebung von Ganzzahl mit Vorzeichen
Das Ergebnis E1 E2 E1 >> rechts verschoben E2 Bitpositionen. Wenn E1 einen Typ ohne Vorzeichen hat oder E1 einen Typ mit Vorzeichen und einen nichtnegativen Wert hat, ist der Wert des Ergebnisses der ganzzahlige Teil des Quotienten von E1/2^E2. Wenn E1 einen Typ mit Vorzeichen und einen negativen Wert hat, ist der resultierende Wert implementierungsdefiniert.
Ich bin neugierig zu wissen, welche Implementierungen/Compiler keine signierten E1 >> 31
als ein Bündel von 11111....
behandeln?
Ein paar wessen -1 ist nicht 1111 ...., und eine Menge, deren Int ist nicht 32 Bits. – user3528438
Hinweis: Verwenden Sie keine veraltete Version des Standards. C-Standard ist C11, nicht C99. Sagte, dass der Text sehr klar ist. Verlassen Sie sich nicht darauf, wenn Sie Ihren Code portabel haben möchten. Beachten Sie, dass die Verschiebung auch undefiniertes Verhalten auslösen kann. Siehe 6.5.7p3 im Standard (d. H. Die einzige gültige Version). – Olaf
Auch viele 32-Bit-Zweierkomplement-Implementierungen, die die Signedness ignorieren und als Ergebnis "1" erzeugen. Der Standard ist in der Tat sorgfältig formuliert, um zu vermeiden, anzugeben, ob ">>" eine arithmetische Verschiebung oder eine logische Verschiebung ausführt. –