Warum wurde 1 << 31 geändert, um in C ++ 14 implementiert zu werden?

In allen Versionen von C und C ++ vor 2014, Schreiben von

1 << (CHAR_BIT * sizeof(int) - 1)

verursacht undefiniertes Verhalten, da Linksverschiebung als äquivalent zur sukzessiven Multiplikation mit @ definiert wi2, und diese Verschiebung verursacht einen vorzeichenbehafteten Ganzzahlüberlauf:

Das Ergebnis vonE1 << E2 istE1 nach links verschobenE2 Bitpositionen; frei gewordene Bits werden mit Nullen gefüllt. [...] WennE1 hat einen vorzeichenbehafteten Typ und keinen negativen Wert undE1 × 2 E2 ist im Ergebnistyp darstellbar, das ist der resultierende Wert; Andernfalls, das Verhalten ist undefiniert.

In C ++ 14 hat sich der Text für @ jedoch geänder<< aber nicht zur Multiplikation:

Der Wert vonE1 << E2 istE1 nach links verschobenE2 Bitpositionen; frei gewordene Bits werden mit Nullen gefüllt. [...] Andernfalls, wennE1 hat einen vorzeichenbehafteten Typ und einen nicht negativen Wert undE1 × 2 E2 ist im @ darstellbentsprechender vorzeichenloser Typ des Ergebnistyps, dann dieser Wert,umgewandelt in den Ergebnistyp, ist der resultierende Wert; Andernfalls ist das Verhalten undefiniert.

Das Verhalten ist jetzt dasselbe wie für die Zuweisung außerhalb des Bereichs zu einem signierten Typ, d. H. Wie in [conv.integral] / 3 behandelt:

Wenn der Zieltyp signiert ist, bleibt der Wert unverändert, wenn er im Zieltyp (und in der Bitfeldbreite) dargestellt werden kann. Andernfalls,der Wert ist implementierungsdefiniert.

Dies bedeutet, dass es immer noch nicht portabel ist, @ zu schreib1 << 31 (auf einem System mit 32-Bit-Int). Warum wurde diese Änderung in C ++ 14 vorgenommen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage