Diese Frage wurde in einem Interview gestellt.
Aus diesem Grund hat die linke Verschiebung <<
eines negativen Wertes undefiniertes Verhalten , während die rechte Verschiebung >>
einer negativen vorzeichenbehafteten Zahl implementierungsdefiniertes Verhalten ?
C11 $ 6.5.7:
Absatz 4:
Das Ergebnis von E1 & lt; & lt; E2 ist E1 linksverschobene E2-Bitpositionen; geräumt Bits sind mit Nullen gefüllt. Wenn E1 einen vorzeichenlosen Typ hat, wird der Wert von das Ergebnis ist E1 x 2 ^ E2, modulo um eins mehr als der Maximalwert reduziert darstellbar im Ergebnistyp. Wenn E1 einen signierten Typ hat und nicht negativer Wert, und E1 x 2 ^ E2 ist im Ergebnistyp darstellbar, dann ist das der resultierende Wert; Ansonsten ist das Verhalten nicht definiert.
Absatz 5:
Das Ergebnis von E1 & gt; & gt; E2 ist E1 rechtsverschobenes E2-Bit Positionen. Wenn E1 einen Typ ohne Vorzeichen hat oder E1 einen Typ mit Vorzeichen hat und a nicht negativer Wert, der Wert des Ergebnisses ist der integrale Teil der Quotient von E1 / 2 ^ E2. Wenn E1 einen Typ mit Vorzeichen und einen negativen Wert hat, Der resultierende Wert ist implementierungsdefiniert.
Warum ist die linke Verschiebung eines negativen vorzeichenbehafteten Werts kein wohldefiniertes Verhalten?
Tags und Links c undefined-behavior language-lawyer bit-shift shift