Supposons que je définisse un syndicat comme ceci: peut me dire quelle est la mémoire où J'essaie de comprendre la sortie TST code> est stocké ressemblera? P>
1102813594 code> que ce programme produit. P> p>
5 Réponses :
Cela dépend de la mise en œuvre (compilateur, système d'exploitation, etc.), mais vous pouvez utiliser le débogueur pour voir le contenu de la mémoire si vous le souhaitez.
Par exemple, dans My MSVC 2008: P>
0x00415748 9a 99 bb 41
HMM, au lieu de "plus grand de ses électeurs", vous signifiez probablement le plus restrictif.
@Rogue: selon la norme - "la taille d'une union suffit à contenir le plus grand de ses membres"
IIRC, de K & R, "Bien que les machines varient, pour chaque machine, il existe un type le plus restrictif: si le type le plus restrictif peut être stocké à une adresse particulière, tous les autres types peuvent également être." - Mais je suppose que vous avez raison, car la norme a toujours raison, + 1 de chaque sens.
@Rogue, vous parlez d'alignement, alors vous avez tous les deux raison. L'Union devrait être correctement alignée sur tous ses membres, généralement définie par le plus restrictif, et il devrait être suffisamment grand pour le plus grand de ses membres.
Le résultat dépend de la mise en œuvre du compilateur, mais pour la plupart des compilateurs X86, Float et Int seront de la même taille. Wikipedia a un très bon diagramme de la disposition d'un flotteur 32 bits http://en.wikipedia.org / wiki / simple_procision_floating-point_format , qui peut aider à expliquer Si vous imprimez l'int comme valeur hexagonale, il sera plus facile de comprendre. p> 1102813594 code>.
Avec une union, les deux variables sont stockées à partir de la même position de mémoire. Un flotteur est stocké dans un format IEEE (ne peut pas se souvenir du numéro standard, vous pouvez rechercher cela [éditer: comme indiqué par d'autres, IEEE 754]). Mais ce sera un complément normalisé de deux (Mantissa est toujours compris entre 0 et 10, l'exposant peut être n'importe quoi) Numéro de point flottant. P>
Vous prenez les 4 premiers octets de ce numéro (encore une fois, vous pouvez rechercher ce que les bits vont où dans les 16 ou 32 bits qu'un flotteur prend, ne peut pas se souvenir). Donc, cela ne signifie fondamentalement rien et ce n'est pas utile comme in int. C'est-à-dire que si vous sachez pourquoi vous voudriez faire quelque chose comme ça, mais généralement, un flotteur et un combo Int n'est pas très utile. P>
Et non, je ne pense pas que ce soit la mise en œuvre définie. Je crois que la norme dicte quel format un flotteur est dans. P>
C ++ Standard ne manda pas la représentation FP compatible IEEE-754 - mais l'encourage avec le MST :: Numérique_Limits
Il est probable que vous vous souvenez mieux que moi. Merci. Est-ce la même chose pour C?
Dans Union, les membres seront partager la même mémoire. afin que nous puissions obtenir la valeur du flotteur en tant que valeur entière. p>
Le format de numéro flottant sera différent du stockage entier. afin que nous puissions comprendre la différence en utilisant l'Union. P>
pour ex: Si je stocke la valeur de 12 entiers dans (32 bits). Nous pouvons obtenir cette valeur 12 comme format de point flottant. P>
Il sera stocké comme signé (1 bit), exponent (8 bits) et précision significative (23 bits). p>
J'ai écrit un petit programme qui montre ce qui se passe lorsque vous préservez le motif de bits d'un flotteur 32 bits dans un entier 32 bits. Il vous donne exactement la même sortie que vous rencontrez:
#include <iostream> int main() { float f = 23.45; int x = *reinterpret_cast<int*>(&f); std::cout << x; // 1102813594 }