Un certain nombre de réponses pour le Dépassement de Pile question de l'Obtention de la norme IEEE Simple précision bits pour un float suggérons d'utiliser un union
structure de type beaucoup les jeux de mots (par exemple: convertir les bits d'un float
en uint32_t
):
union {
float f;
uint32_t u;
} un;
un.f = your_float;
uint32_t target = un.u;
Toutefois, la valeur de l' uint32_t
membre de l'union semble être spécifiée selon le standard C99 (au moins le projet de n1124), où la section 6.2.6.1.7 états:
Lorsqu'une valeur est stockée dans un membre d'un objet de type union, les octets de la représentation des objets qui ne correspondent pas à ce membre, mais ne correspondent à d'autres membres de prendre de quelconques valeurs.
Au moins une note de bas de page de l'C11 n1570 projet semble sous-entendre que ce n'est plus le cas (voir la note de bas de page 95 dans 6.5.2.3):
Si le membre utilisé pour lire le contenu d'une union de l'objet n'est pas le même que le membre de la dernière de stocker une valeur dans l'objet, la partie appropriée de l'objet de la représentation de la valeur, est réinterprétée comme un objet de représentation dans le nouveau type décrit dans 6.2.6 (un processus parfois appelé ‘type beaucoup les jeux de mots"). Cela pourrait être un piège de la représentation.
Toutefois, le texte de l'article 6.2.6.1.7 est la même dans le C99 projet dans le C11 projet.
Est ce comportement fait quelconque en vertu de C99? Est-il devenu spécifié dans C11? Je me rends compte que la plupart des compilateurs semblent appuyer cette, mais il serait bon de savoir si il est spécifié dans la norme, ou tout simplement un très commun de l'extension.