union problem
-
Hi,
ich sitz hier grad über einem kleine problem, welches ich anhand des gegebenen codes nicht ganz verstehe...
Es gibt eine union:
typedef union { unsigned int Val; unsinged short w[2]; unsigned char v[4]; } DWORD_VAL;
Innerhalb einer Funktion wird dann
#define SIN45 46341 DWORD_VAL temp; short value; temp.Val = SIN45*r1; /* r1 = short value */ value = temp.w[1];
Innerhalb der Union kann man immer nur auf einen Wert zugreifen... wenn jetzt innerhalb von Val der Wert oben gespeichert wird, steht dann automatisch dieser Wert entsprechend in w[1] und w[2] drinnen?
Wie muss ich mir das genau vorstellen, wenn z.b. in
temp.Val = 120321;
gespeichert wird und anschließend mit w[1] zugegriffen wird - welcher wert steht dann in w[1] und [0] drinnen?
gruß
Hans-Im-Glück
-
es sind verschiedene sichtweisen auf dieselben daten.
-
Hans-Im-Glück schrieb:
Innerhalb der Union kann man immer nur auf einen Wert zugreifen...
Gemeint ist, dass immer nur der zuletzt gespeicherte Wert enthalten ist, jeder Zugriff auf den Wert irgendeines union-Members ist ein Zugriff auf diesen zuletzt gespeicherten Wert (möglicherweise mit anderem Typ).
wenn jetzt innerhalb von Val der Wert oben gespeichert wird, steht dann automatisch dieser Wert entsprechend in w[1] und w[2] drinnen?
In gewisser Weise. Allerdings unterliegt der Zugriff auf den Wert eines Objektes gewissen Beschränkungen (C99: 6.5/7), im Wesentlichen ist so ein Zugriff nur definiert wenn der Typ des Ausdrucks, mit dem zugegriffen wird
- mit dem Typ des Objekts (ggf. stärker qualifiziert) übereinstimmt, oder
- die vorzeichenbehaftete bzw. vorzeichenlose Version des Objekts ist (also int<->unsigned, long<->unsigned long usw.), oder
- ein Zeichentyp (char,unsigned char,signed char), oder
- ein Aggregat oder union mit einem der obigen Typen als Member ist.
Die Bestimmung, was genau der Typ eines Objektes ist, ist nicht immer ganz einfach aber hier nicht problematisch.
Nachtemp.Val = 120321;
hat der im union gespeicherte Wert den Typ unsigned.
Zugegriffen werden darf darauf nur mit Ausdrücken der Typen int,unsigned,char,unsigned char,signed char (und einer Phalanx aus Aggregaten und unions, die uns hier nicht weiter interessiert).
Der Typ des Ausdruckstemp.w[0]
ist short. Damit hat dieser Ausdruck an dieser Stelle undefiniertes Verhalten.
-
vielen dank für die ausführliche Erklärung.
Hans