Comment cela se fait-il que j'obtiens les bonnes valeurs (aux deux dernières affectations) pour chaque attribut alors qu'ils ont le même emplacement mémoire ?
The details of that allocation are implementation-defined,
and it's undefined behavior to read from the member of the union that wasn't most
recently written. Many compilers implement, as a non-standard language extension,
the ability to read inactive members of a union.
Donc en gros, ne fais pas ça. (Le C++ est un langage permissif, il t'autorise à écrire du code non valide, qui fait n'importe quoi. C'est à toi de faire attention à ne pas faire ces erreurs)
Merci pour ta réponse. En effet, avec deux attributs de même taille, les valeurs non initialisées sont perdues à chaque fois.
En revanche j'ai toujours du mal à comprendre pourquoi.
Many compilers implement, as a non-standard language extension,
the ability to read inactive members of a union.
Comment le compilateur peut-il implementer le fait d'avoir deux valeurs différentes sur un même emplacement mémoire ? Cela me parait impossible... Car même s'ils utilisent une taille mémoire différente, cela doit quand même affecter l'autre attribut, non ?
Lorsque l'on met un double en mémoire, la mantisse se trouve à la droite de l'emplacement mémoire (un double constitué de 64 bits dont 52 bits pour la mantisse situés le plus à droite de l'emplacement mémoire) et une fois qu'on a trouvé la valeur de la mantisse (après avoir normalisé et pris la valeur décimale en binaire), on remplit le reste de l'emplacement mémoire de la mantisse avec des zéros, à droite de la valeur (ces valeurs n'étant finalement pas utilisé).
Je suppose donc qu'au lieu de mettre les valeurs non utilisées situées à droite de la mantisse à 0, le compilateur les ignore simplement ? Ce qui fait que pour un int, les valeurs commençant par les bits non utilisés de la mantisse ne seront pas affectées ?
Est-ce que mon raisonnement est juste ?
J'espère avoir été assez clair dans mon explication.
Presque. Les bits sont utilisés, mais ils correspondent aux chiffres tres loin apres la virgule. Et par defaut, std::cout n'affiche pas tous ces chiffres. Et donc effectivement, quand tu les modifies avec l'union, tu ne vois pas ces changement, du fait que std::cout arrondi les chiffres. Et std::precision affiche ces chiffres, ce qui permet de voir le changement.
Note, tu peux aussi utiliser std::bitset pour afficher la représentation binaire des nombres, pour bien voir le résultat.
Merci pour l'explication. Je comprends mieux maintenant
Problème de compréhension des unions
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Discord NaN. Mon site.
Discord NaN. Mon site.
Discord NaN. Mon site.
Discord NaN. Mon site.