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?
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:
conv.f = val[i]
. Dies konvertiert die Ganzzahl in val[i]
in einen Gleitkommawert und speichert sie in conv.f
. val[i] = conv.i
. Dadurch wird das unformatierte Fließkomma-Bitmuster in der Union gespeichert und es wird val[i]
. 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.