Welche Art von Konvertierung macht dieser Code?

8

Ich bin auf diesen Code gestoßen, wo sie versuchen, von float nach int zu konvertieren

%Vor%

Aber ich bin einfach nicht in der Lage zu verstehen, wie das funktionieren würde. Der val[i] wird conv.f zugewiesen und dann wird der conv.i verwendet. Speichern Sie den Wert in val[i] . conv ist ein Union-Typ, da wir f verwenden, i hat keinen gültigen Wert, richtig?

Fehle ich hier etwas?

    
bluefalcon 06.11.2015, 06:03
quelle

2 Antworten

5

Es macht etwas namens type punning .

Beachten Sie, dass Fließkommawerte oft in einem ganz anderen Format als Ganzzahlen gespeichert werden (am häufigsten IEEE Fließkommaformat) ), und die Verwendung der Union ist, das rohe Gleitkommaformat zu erhalten.

Um genauer zu sein, das ist was passiert:

  1. Die Zuordnung conv.f = val[i] . Dies konvertiert die Ganzzahl in val[i] in einen Gleitkommawert und speichert sie in conv.f .
  2. Die Zuordnung val[i] = conv.i . Dadurch wird das unformatierte Fließkomma-Bitmuster in der Union gespeichert und es wird val[i] .
  3. zugewiesen

Dies funktioniert, weil eine Union nicht wie eine Struktur mit separaten Mitgliedern ist. In einer Union teilen alle Mitglieder denselben Speicher. Wenn Sie ein Mitglied der Union ändern, werden alle Mitglieder geändert.

Ein Hinweis darauf, warum eine Union verwendet wird: Diese Konvertierung könnte auch auf andere Weise erfolgen, aber dann würde die strikte Aliasing-Regel , jedoch ist die Verwendung von unions für den Typ punning erlaubt.

    
Some programmer dude 06.11.2015, 06:09
quelle
0

union ermöglicht das Speichern verschiedener Datentypen am selben Ort. Space wird nur für das Mitglied mit sizeof(member) maximum zugewiesen.

Sobald das Mitglied f initialisiert ist, kann von diesem Ort aus auf i zugegriffen werden.

    
haccks 06.11.2015 06:09
quelle

Tags und Links