Не определено ли определение типа через объединение в C99 и стало ли оно указанным в C11?

Количество ответов на вопрос переполнения стекаПолучение битов одинарной точности IEEE для поплавка предложить использоватьunion структура для типа штамповки (например: поворот битыfloat вuint32_t):

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

Тем не менее, значениеuint32_t член объединения представляется неопределенным в соответствии со стандартом C99 (по крайней мере, проект n1124), где в разделе 6.2.6.1.7 говорится:

When a value is stored in a member of an object of union type, the bytes of the object representation that do not correspond to that member but do correspond to other members take unspecified values.

По крайней мере, одна сноска проекта C11 n1570, по-видимому, подразумевает, что это больше не так (см. Сноску 95 в 6.5.2.3):

If the member used to read the contents of a union object is not the same as the member last used to store a value in the object, the appropriate part of the object representation of the value is reinterpreted as an object representation in the new type as described in 6.2.6 (a process sometimes called ‘‘type punning’’). This might be a trap representation.

Однако текст к разделу 6.2.6.1.7 в проекте С99 такой же, как и в проекте С11.

Это поведение на самом деле не определено в C99? Это стало указано в С11? Я понимаю, что большинство компиляторов, кажется, поддерживают это, но было бы неплохо знать, указано ли это в стандарте, или это просто очень распространенное расширение.

Ответы на вопрос(4)

Ваш ответ на вопрос