Pourquoi mon syndicat ne montre-t-il pas les bonnes valeurs?

union { int i; bool b; } x; xi = 20000; xb = true; cout << xi; 

Il imprime 19969. Pourquoi n’imprime-t-il pas 20000?

Une union n’est pas une struct . Dans une union , toutes les données occupent le même espace et peuvent être traitées comme des types différents via ses noms de champs. Lorsque vous affectez la valeur true à xb , vous écrasez les bits de poids faible de 20000 .

Plus précisement:

20000 en binary: 100111000100000

19969 en binary: 100111000000001

Dans ce cas, vous avez mis une valeur d’un octet de 1 (00000001) dans les 8 bits de poids faible de 200000.

Si vous utilisez une struct au lieu d’une union , vous aurez de la place pour un int et un bool , plutôt que simplement un int , et vous verrez les résultats escomptés.

Dans une union, tous les membres de données commencent au même emplacement de mémoire. Dans votre exemple, vous ne pouvez utiliser qu’un seul membre de données à la fois. Cette fonctionnalité peut être utilisée pour certaines astuces, comme exposer les mêmes données de plusieurs manières:

 union Vector3 { int v[3]; struct { int x, y, z; }; }; 

Ce qui vous permet d’accéder aux trois entiers soit par leur nom (x, y et z), soit par un tableau (v).

Un syndicat ne stocke qu’un seul des membres à un moment donné. Pour obtenir des résultats définis, vous ne pouvez lire que le même membre du syndicat que celui qui a été écrit pour la dernière fois. Faire autrement (comme vous êtes ici) ne donne officiellement ni plus ni moins que des résultats indéfinis.

Parfois, les unions sont utilisées intentionnellement pour le typage (par exemple, en regardant les octets qui composent un float). Dans ce cas, c’est à vous de donner un sens à ce que vous obtenez. Le langage tente en quelque sorte de vous donner une chance de combattre, mais il ne peut pas vraiment garantir grand chose.

Union en C facilite le partage de l’espace mémoire par différentes variables.
Ainsi, lorsque vous modifiez une variable dans l’union, les valeurs de toutes les autres variables sont également affectées.