Warum ruft die Linksschaltungsoperation Undefiniertes Verhalten auf, wenn der linke Operand einen negativen Wert hat?

In C ruft die bitweise Linksverschiebung ein undefiniertes Verhalten auf, wenn der linke Operand einen negativen Wert hat.

Relevantes Zitat aus ISO C99 (6.5.7 / 4)

Das Ergebnis von E1 << E2 ist E1 linksverschobene E2-Bitpositionen; leere Bits werden mit Nullen gefüllt. Wenn E1 einen vorzeichenlosen Typ hat, ist der Wert des Ergebnisses E1 × 2 E2, reduzierte Modulo um eins mehr als den im Ergebnistyp darstellbaren Maximalwert. Wenn E1 einen vorzeichenbehafteten Typ und einen nichtnegativen Wert hat und E1 × 2 E2 ist im Ergebnistyp darstellbar, das ist der resultierende Wert; Andernfalls,das Verhalten ist unbestimmt.

Aber in C ++ ist das Verhalten gut definiert.

ISO C ++ - 03 (5.8 / 2)

Der Wert von E1 << E2 ist E1 (als Bitmuster interpretiert) linksverschobene E2-Bitpositionen; frei gewordene Bits werden mit Nullen gefüllt. Wenn E1 einen vorzeichenlosen Typ hat, ist der Wert des Ergebnisses E1 multipliziert mit der auf die Potenz E2 angehobenen Größe 2, reduziert modulo ULONG_MAX + 1, wenn E1 einen vorzeichenlosen langen Typ hat, andernfalls UINT_MAX + 1. [Anmerkung: Die Konstanten ULONG_MAX und UINT_MAX sind im Header definiert.] ]

Das bedeute

int a = -1, b=2, c;
c= a << b ;

invokes undefiniertes Verhalten in C, aber das Verhalten ist in C ++ gut definiert.

Was hat das ISO-C ++ - Komitee gezwungen, dieses Verhalten als gut definiert im Gegensatz zum Verhalten in C zu betrachten?

uf der anderen Seite ist das Verhaltenimplementation defined für bitweise Rechtsverschiebung, wenn der linke Operand negativ ist, richtig?

Meine Frage ist, warum der linke Schichtbetrieb undefiniertes Verhalten in C aufruft und warum der rechte Schichtbetreiber nur das implementierungsdefinierte Verhalten aufruft.

P.S: Bitte geben Sie keine Antworten wie "Es ist undefiniertes Verhalten, weil der Standard dies sagt". : P

Antworten auf die Frage(16)

Ihre Antwort auf die Frage