Forum: Mikrocontroller und Digitale Elektronik short int - unteres byte herrauslesen


von hans gerlach (Gast)


Lesenswert?

Hallo gibt es eine Funktion die mir einen short int oder long int in
einzelne Bytes (short=2,long=4) aufteilt oder muss mir das selbst
zurecht shiften?
danke.

von Der inoffizielle WM-Rahul (Gast)


Lesenswert?

Ja.

von hans gerlach (Gast)


Lesenswert?

welche

von The Daz (Gast)


Lesenswert?

Du brauchst kein shiften. Das geht ganz einfach mit ner union oder ein
bischen pointer/cast Gewurstel.

von Thomas (Gast)


Lesenswert?

Pointergewurschtel ist nicht notwendig. Sauber sieht es mit Unions aus.
Als Beispiel vom PC ein Long mit byteweisem Auslesen, sollte sich auch
auf µC-C übertragen lassen:


union U{
    char c[4];
    long i;
};

int main()
{
    U u;
    u.i = 0x12345678;

    for (int i=3; i>=0; --i)
        printf("%x ", u.c[i]);

von Thomas (Gast)


Lesenswert?

So, da fehlt jetzt die Hälfte, weil ich versucht habe TAB im Textfenster
einzugeben und dann Submit ausgelöst habe ;)

Die Unionlösung sieht eigentlich ganz elegant aus. Für was anderes
fällt mir eigentlich auch kein sinnvoller Nutzen von Unions ein...

von hans gerlach (Gast)


Lesenswert?

vielen dank, werds mit ne runion machen, sieht wirklich elegant aus.
vielen dank!

von Rolf Magnus (Gast)


Lesenswert?

> Pointergewurschtel ist nicht notwendig.

Wäre aber besser.

> Sauber sieht es mit Unions aus.

Sauber ist das gar nicht. Unions sind für sowas eigentlich nicht
gedacht. Laut C-Norm darf man aus einer Union auch nur das Member
lesen, das man davor als letztes reingeschrieben hat. Geht halt
meistens trotzdem, aber ist eigentlich eher ein Hack.

von A.K. (Gast)


Lesenswert?

Bis letztes Jahr hatte ich bei dieser "union" Sache den Eindruck, dass
nur Maschinen aus dem Neolithikum damit ein Problem haben würden. Das ja
wohl alles was heute noch rumläuft das richtig behandeln wird.

Denkste!

Maxim hat es fertig gebracht, eine Architektur zu definieren, in der
ein Pointer-to-Byte anders dargestellt wird, als ein Pointer-to-Word.
Und weil MAXQ2000 nur 16bittig ist, kann er Speicher als 64K Worte oder
als 64K Bytes adressieren. Also kann nur die Hälfte vom Speicher auch
byteweise verwendet werden - eines der angesprochenen Urviecher hatte
dafür ein 17.Adressbit im Carryflag, MAXQ nicht. Da können solche
Tricks bös in die Hose gehen.

Wüsste gerne welcher Teufel Maxim da geritten hat.

von Peter D. (peda)


Lesenswert?

Da hat Rolf recht, ne union ist ein böser Hack und geht nur gut auf der
gleichen CPU und mit der gleichen Compilerversion.

Schieben ist dagegen immer richtig, also völlig Compiler und
CPU-unabhängig.

Und die meisten Compiler optimieren das auch sehr ordentlich, bzw.
wenns einen Zyklus länger dauert, bricht man sich doch auch kein Bein.


Peter

von Simon K. (simon) Benutzerseite


Lesenswert?

Für das unterste Byte brauch man nochnichtmals Schieben.


long long_var = 0x12345678;
char lbyte = long_var & 0x000000FF;


Es müsste sogar ohne & Operator funktionieren.


Für die anderen Bytes kann man aber mit Pointern handtieren:

long long_var = 0x12345678;
char byte = *( ((char *) &long_var ) + 1) ); // Gibt das Byte über dem
untersten zurück.


PS: Für was ist Union denn dann gedacht? Oder ist es eine "herzlos
implementierte Funktion" die quasi Obsolet ist?

von Union (Gast)


Lesenswert?

Unions sind ziemlich sinnlos ;)

Aber vor dem Pointergemüse würde ich dann doch lieber schieben und
Maskieren nehmen.

von Reinhard B. (brainstorm)


Lesenswert?

Hallo!

Also wenn ich an so Begriffe wie Byte-Order denke, dann würde ich
sagen, dass Shiften (von den hier vorgeschlagenen) Methoden die einzig
richtige und sichere Methode ist. Sowohl beim hantieren mit Pointern
als auch mit ner Union greift man da schnell daneben denk ich.

mfg
Reinhard

von Simon K. (simon) Benutzerseite


Lesenswert?

>>Aber vor dem Pointergemüse würde ich dann doch lieber schieben und
Maskieren nehmen.

Hast recht, ist doch wüster geworden als ich es mir gedacht habe
räusper.

Naja, lets shift it!

von Peter D. (peda)


Lesenswert?

Pointer ist doch das gleiche, wie ne Union, da muß man auch die
Byteorder kennen, sonst gehts schief.

Ne Union macht durchaus Sinn, z.B. um einen Datensatz im EEPROM zu
speichern.
Da ja die gleiche CPU und die gleiche Compilerversion die Schreib- und
die Leseroutine ausführen, ist die Byteorder im EEPROM völlig egal.
Nach dem Lesen ist z.B ein float wieder ein float.


Peter

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.