Union

Willemers Informatik-Ecke

Diese Seite basiert auf Inhalten aus meinem Buch "Einstieg in C++", seinerzeit erschienen im Verlag Galileo Computing. Das Buch ist inzwischen vergriffen.


Das Nachfolgebuch heißt C++. Der Einstieg und ist bei Wrox im Verlag Wiley-VCH erschienen.

Die Inhalte dieser Website unterliegen meinem Urheberrecht und dürfen trotz inhaltlicher Überschneidungen mit dem Buch dank der freundlichen Genehmigung des Verlags Wiley-VCH hier erscheinen.

Eine besondere Typkonstruktion ist die union. Man könnte sie als Entweder-oder-Verbund bezeichnen. In einer Union werden mehrere Variablen zusammengefasst, von denen nur eine gebraucht wird. Es kann also immer nur eines der angegebenen Elemente verwendet werden. Eine Union nimmt darum so viel Speicher ein, wie das größte seiner Elemente benötigt.

Beispiel

In einer Union werden Informationen abgestellt, die alternativ zueinander stehen. So könnte die Bankverbindung durch eine Kreditkarte mit Nummer und Ablaufmonat oder ein Girokonto mit Kontonummer und Bankleitzahl angegeben werden:

union tBankverbindung
{
    tKreditKarte karte;
    tGirokonto kto;
};

Achtung!

Die union enthält nur die reinen Daten. Sie speichert nicht, auf welche Variante zuletzt zugegriffen wurde. Es wird nicht verhindert, dass die eine Version geschrieben und die andere gelesen wurde. Es ist also ohne Compiler-Warnung möglich, in karte zu schreiben und aus kto zu lesen. Dass das Ergebnis unsinnig ist, wird bestenfalls der Benutzer merken.

Typumwandlung

In manchen Programmen wird mit Hilfe der Union die Bytereihenfolge zwischen verschiedenen Maschinen getauscht. Ein Wort von 16 Bit besteht aus zwei Bytes. Nun kann die Reihenfolge dieser Bytes auf verschiedenen Maschinen unterschiedlich sein. Auf PCs wird beispielsweise das niedrigwertige Byte zuerst genommen; auf den meisten RISC-Prozessoren ist es genau umgekehrt.

union tWandler
{
    struct
    {
        unsigned char hi;
        unsigned char lo;
    } byte;
    unsigned short word;
} Wandler;

int main()
{
    Wandler.word = 7656;
    cout << (int)Wandler.byte.hi << endl;
    cout << (int)Wandler.byte.lo << endl;
}
Als Ergebnis liefert das Programm auf einen Intel-PC die Werte 232 und 29. Die Verwendung einer union kann leicht zu Unübersichtlichkeiten führen. Darum sollten Sie sie nur einsetzen, wenn es dazu keine Alternative gibt.


Informatik-Ecke Einstieg in C++ (C) Copyright 2005 Arnold Willemer