¿El tipo punning a través de una unión no se especifica en C99, y se ha especificado en C11?
Un número de respuestas para la pregunta de desbordamiento de pilaObtención de los bits de precisión simple IEEE para un flotador sugerir usar ununion
estructura para el punning de tipo (por ejemplo: girar los bits de unfloat
en unauint32_t
):
union {
float f;
uint32_t u;
} un;
un.f = your_float;
uint32_t target = un.u;
Sin embargo, el valor de lauint32_t
el miembro de la unión parece no estar especificado de acuerdo con la norma C99 (al menos el borrador n1124), donde la sección 6.2.6.1.7 establece:
Cuando un valor se almacena en un miembro de un objeto de tipo de unión, los bytes de la representación del objeto que no corresponden a ese miembro pero sí corresponden a otros miembros toman valores no especificados.
Al menos una nota al pie del borrador C11 n1570 parece implicar que esto ya no es el caso (ver la nota 95 en 6.5.2.3):
Si el miembro utilizado para leer el contenido de un objeto de unión no es el mismo que el último utilizado para almacenar un valor en el objeto, la parte apropiada de la representación de objeto del valor se reinterpreta como una representación de objeto en el nuevo tipo como descrito en 6.2.6 (un proceso a veces llamado '' punning tipo ''). Esto podría ser una representación trampa.
Sin embargo, el texto de la sección 6.2.6.1.7 es el mismo en el borrador C99 que en el borrador C11.
¿Es este comportamiento realmente no especificado en C99? ¿Se ha especificado en C11? Me doy cuenta de que la mayoría de los compiladores parecen admitir esto, pero sería bueno saber si está especificado en el estándar, o simplemente una extensión muy común.