Ist die Typ-Punning-Funktion durch eine in C99 nicht angegebene Vereinigung und wurde sie in C11 angegeben?

Eine Reihe von Antworten auf die Frage zum StapelüberlaufAbrufen der IEEE-Bits mit einfacher Genauigkeit für einen Float empfehlen die Verwendung einesunion Struktur für Typ-Punning (z. B .: Drehen der Bits von afloat in einuint32_t):

union {
    float f;
    uint32_t u;
} un;
un.f = your_float;
uint32_t target = un.u;

Der Wert deruint32_t Das Gewerkschaftsmitglied scheint gemäß der Norm C99 (mindestens Entwurf n1124) nicht spezifiziert zu sein, wobei in Abschnitt 6.2.6.1.7 Folgendes festgelegt ist:

Wenn ein Wert in einem Element eines Objekts vom Typ Union gespeichert wird, nehmen die Bytes der Objektdarstellung, die nicht diesem Element, sondern anderen Elementen entsprechen, nicht angegebene Werte an.

Mindestens eine Fußnote des C11 n1570-Entwurfs scheint zu implizieren, dass dies nicht mehr der Fall ist (siehe Fußnote 95 in 6.5.2.3):

Wenn das Element, das zum Lesen des Inhalts eines Union-Objekts verwendet wird, nicht mit dem Element identisch ist, das zuletzt zum Speichern eines Werts im Objekt verwendet wurde, wird der entsprechende Teil der Objektdarstellung des Werts als Objektdarstellung im neuen Typ als neu interpretiert beschrieben in 6.2.6 (ein Prozess, der manchmal '' type punning '' genannt wird). Dies könnte eine Trap-Darstellung sein.

Der Text in Abschnitt 6.2.6.1.7 ist jedoch im Entwurf C99 derselbe wie im Entwurf C11.

Ist dieses Verhalten unter C99 tatsächlich nicht spezifiziert? Wurde es in C11 spezifiziert? Mir ist klar, dass die meisten Compiler dies zu unterstützen scheinen, aber es wäre schön zu wissen, ob es im Standard spezifiziert ist oder nur eine sehr verbreitete Erweiterung.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage