Den Speicherinhalt einer Union verstehen

8

Angenommen, ich definiere eine Vereinigung wie folgt:

%Vor%

Kann mir jemand sagen, wie der Speicher, in dem tst gespeichert ist, aussieht?

Ich versuche die Ausgabe 1102813594 zu verstehen, die dieses Programm erzeugt.

    
Moeb 04.03.2010, 04:32
quelle

5 Antworten

12

Es hängt von der Implementierung ab (Compiler, Betriebssystem usw.), aber Sie können den Debugger verwenden, um den Speicherinhalt tatsächlich zu sehen, wenn Sie möchten.

Zum Beispiel in meinem MSVC 2008:

%Vor%

ist der Speicherinhalt. Lesen Sie von LSB auf der linken Seite (Intel, Little-Endian-Maschine), das ist 0x41bb999a oder tatsächlich 1102813594.

Im Allgemeinen werden Integer und Float jedoch in denselben Bytes gespeichert. Abhängig davon, wie Sie auf die Union zugreifen, erhalten Sie die Ganzzahl- oder Gleitkomma Interpretation dieser Bytes. Die Größe des Speicherplatzes hängt wiederum von der Implementierung ab, obwohl sie normalerweise die größte ihrer Komponenten ist, die an einer festen Grenze ausgerichtet ist.

Warum ist der Wert so wie in Ihrem (oder meinem) Fall? Sie sollten über die Darstellung der Fließkommazahl dafür lesen (siehe ieee 754)

    
Eli Bendersky 04.03.2010, 04:34
quelle
5

Das Ergebnis hängt von der Compilerimplementierung ab. Aber für die meisten x86-Compiler haben float und int die gleiche Größe. Wikipedia hat ein ziemlich gutes Diagramm des Layouts eines 32-Bit-Floats Ссылка , das zur Erklärung von 1102813594 beitragen kann. .

Wenn Sie das int als hexadezimalen Wert ausgeben, ist es einfacher herauszufinden.

%Vor%     
John Knoeller 04.03.2010 04:39
quelle
4

Bei einer Vereinigung werden beide Variablen am selben Speicherort gespeichert. Ein Float wird in einem IEEE-Format gespeichert (kann sich nicht an die Standardnummer erinnern, Sie können das nachschlagen [edit: wie von anderen angegeben, IEEE 754]). Aber, es wird ein Zweierkomplement normalisiert (Mantisse ist immer zwischen 0 und 10, Exponent kann alles sein) Gleitkommazahl.

Sie nehmen die ersten 4 Bytes dieser Zahl (wieder können Sie nachsehen, welche Bits wo in den 16 oder 32 Bits gehen, die ein Float aufnimmt, kann sich nicht erinnern). Es bedeutet also im Grunde nichts und es ist nicht als Int. Das heißt, es sei denn, Sie wissen, warum Sie so etwas tun möchten, aber normalerweise ist eine Float- und Int-Combo nicht sehr nützlich.

Und, nein, ich denke nicht, dass die Implementierung definiert ist. Ich glaube, dass der Standard vorschreibt, in welchem ​​Format ein Float ist.

    
Jeff Walker 04.03.2010 04:40
quelle
3

In der Union teilen die Mitglieder den gleichen Speicher. so dass wir den Float-Wert als Integer-Wert erhalten können.

Das Floating-Zahlenformat unterscheidet sich vom Integer-Speicher. damit wir den Unterschied mit der Vereinigung verstehen können.

Für Beispiel:        Wenn ich den 12 Integer-Wert in (32 Bit) speichere. Wir können diesen 12-Wert als Gleitkommaformat erhalten.

Es wird als vorzeichenbehaftet (1 Bit), Exponent (8 Bit) und signifikante Genauigkeit (23 Bit) gespeichert.

    
sganesh 04.03.2010 05:44
quelle
1

Ich habe ein kleines Programm geschrieben, das zeigt, was passiert, wenn Sie das Bitmuster eines 32-Bit-Fließkommas in einer 32-Bit-Ganzzahl beibehalten. Es gibt Ihnen die exakt gleiche Ausgabe, die Sie gerade erleben:

%Vor%     
0x499602D2 20.04.2013 17:56
quelle