68 votes

Le typage via un syndicat n'est-il pas spécifié dans C99 et est-il devenu spécifié dans C11?

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.

46voto

ouah Points 75311

Le comportement de type beaucoup les jeux de mots avec l'union changé de C89 de C99. Le comportement en C99 est le même que le C11.

Comme Wug a noté dans sa réponse, le type de beaucoup les jeux de mots est autorisé en C99 / C11. Une valeur quelconque qui pourrait être un piège est lue lorsque les membres du syndicat sont de taille différente.

La note de bas de page a été ajoutée dans C99 après Clive D. W. Plume Vice-Rapport n ° 257:

Enfin, l'un des changements de C90 à C99 a été de supprimer toute restriction sur l'accès à un membre d'un syndicat, lors de la dernière banque à une autre. La raison en est que le comportement dépendra de la représentation des valeurs. Depuis ce point est souvent mal compris, il pourrait être utile de faire clairement dans la Norme.

[...]

Pour traiter de la question à propos de "type beaucoup les jeux de mots", attacher une nouvelle note de bas de page 78 pour les mots "membre désigné" dans 6.5.2.3#3: 78a Si le membre utilisé pour accéder au contenu d'une union de l'objet n'est pas le même que le dernier membre utilisé pour stocker une valeur dans l'objet, la partie appropriée de l'objet de la représentation de la valeur est réinterprété 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.

Le libellé de Clive D. W. Plume a été accepté pour un Rectificatif Technique dans la réponse par le Comité pour la Vice-Rapport n ° 283.

21voto

Stephen Canon Points 58003

L'original C99 spécification de gauche ce indéterminée.

L'un des rectificatifs techniques de C99 (TR2, je pense) ajouté à la note de bas de page 82 pour corriger cet oubli:

Si le membre utilisé pour accéder au contenu d'une union de l'objet n'est pas le même que le dernier membre utilisé pour stocker une valeur dans l'objet, la partie appropriée de l'objet de la représentation de la valeur est réinterprété 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.

Que la note de bas de page est conservée dans le C11 standard (c'est de la note de bas de page 95 en C11).

0voto

Wug Points 7672

Toutefois, cela semble violer le standard C99 (au moins le projet de n1124), où la section 6.2.6.1.7 états de choses. Est ce comportement fait quelconque en vertu de C99?

Non, vous êtes beaux.

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.

Cela s'applique à des blocs de données de tailles différentes. I. e, si vous avez:

union u
{
    float f;
    double d;
};

et vous attribuer quelque chose à f, il serait de changer le bas 4 octets de d, mais la partie supérieure de 4 octets est dans un état indéterminé.

Les syndicats existent principalement pour le type de beaucoup les jeux de mots.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X