Czy wykrawanie typu przez związek nieokreślony w C99 i zostało określone w C11?

Szereg odpowiedzi na pytanie Przepełnienie stosuUzyskiwanie bitów IEEE o pojedynczej precyzji dla pływaka zasugeruj użycie aunion struktura do wykrawania typu (np .: obracanie bitów afloat w auint32_t):

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

Jednak wartośćuint32_t członek związku wydaje się być nieokreślony zgodnie ze standardem C99 (co najmniej projekt n1124), gdzie sekcja 6.2.6.1.7 stanowi:

Gdy wartość jest przechowywana w elemencie obiektu typu unii, bajty reprezentacji obiektu, które nie odpowiadają temu członkowi, ale odpowiadają innym członkom, przyjmują nieokreślone wartości.

Przynajmniej jeden przypis projektu C11 n1570 wydaje się sugerować, że tak nie jest (patrz przypis 95 w 6.5.2.3):

Jeśli element używany do odczytu zawartości obiektu unii nie jest taki sam jak element ostatnio używany do przechowywania wartości w obiekcie, odpowiednia część reprezentacji obiektu wartości jest reinterpretowana jako reprezentacja obiektu w nowym typie jako opisany w 6.2.6 (proces nazywany czasem „punningiem typu”). Może to być reprezentacja pułapki.

Jednak tekst w sekcji 6.2.6.1.7 jest taki sam w projekcie C99, jak w projekcie C11.

Czy to zachowanie jest rzeczywiście nieokreślone w C99? Czy zostało to określone w C11? Zdaję sobie sprawę, że większość kompilatorów zdaje się to obsługiwać, ale byłoby miło wiedzieć, czy jest to określone w standardzie, czy po prostu bardzo popularne rozszerzenie.

questionAnswers(4)

yourAnswerToTheQuestion