Forum: Compiler & IDEs uint32_t auftrennen und wieder zusammenfügen


von Zerhacker (Gast)


Lesenswert?

Abend!

Was ist den der effizienteste Weg eine uint32_t Variable in 4 uint8_t zu 
zerteilen, bzw. zusammenzufügen?

von Floh (Gast)


Lesenswert?

union?

von Zerhacker (Gast)


Lesenswert?

Ich habe zu mindestens gelesen, dass man unions in der Beziehung meiden 
sollte.

von Kai S. (zigzeg)


Lesenswert?

Ich denke das häng vom verwendeten System/Prozessor ab.
Also entweder shifts, oder im memory ablegen, z.B. mittels union.

Im Zweifelsfall einfach ausprobieren !

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Überleg dir, wie du eine Dezimalzahl in ihre Ziffern zerlegst bzw. 
wieder zusammensetzt. Dann nimm als nicht 10 als Basis des 
Zahlensystems, sondern 256.

Violà.

von Mark B. (markbrandis)


Lesenswert?

Mit Bitschuften?

1
uint32_t grosse_variable = 0xABCD;
2
uint8_t  byte_array[4];
3
4
byte_array[0] = (uint8_t)  grosse_variable;
5
byte_array[1] = (uint8_t) (grosse_variable >>  8);
6
byte_array[3] = (uint8_t) (grosse_variable >> 16);
7
byte_array[4] = (uint8_t) (grosse_variable >> 24);

von 2ter Gast (Gast)


Lesenswert?

Die Frage kann man eigentlich nur beantworten, wenn man sich das 
Assembler-Listing anschaut. Man kann schließlich nicht wissen, was der 
Compiler macht.

von Mark B. (markbrandis)


Lesenswert?

Ähm ja. Die Indizes sind natürlich falsch, es soll 0 1 2 3 gehen und 
nicht 0 1 3 4.

von Tom M. (tomm) Benutzerseite


Lesenswert?

>effizient

Effizient in Bezug worauf? Laufzeit? Speicherbedarf? Stromverbrauch? 
Arbeitsplatzsicherung? ;)

Bitschuften ;) ist portabel und lesbar und ich vermute, dass der GCC das 
wunderbar optimieren kann, wenn man ihm das sagt (-O). Ich mache es drum 
immer so, wie Mark es beschrieben hat.

Wenn die endianness bekannt ist, die Wartbarkeit und Portabilität egal 
sind: union.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.