www.mikrocontroller.net

Forum: GCC C Bitoperation: 32 zu 4*8


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: olpo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
hallo,

ich habe eine Uint32 Variable.
Wie kann ich die aufteilen in ein Uint8 Array[4] ?
Also, es soll in Array[0] das höchstwertige Bit stehen und in Array[3] 
das minderwertigste.

Autor: Εrnst B✶ (ernst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
union aus uint32_t und uint8_t[4].

beim Füllen "htonl" verwenden.

Autor: Udo Schmitt (urschmitt)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Kommt darauf an ob der verwendete Rechner/Prozessor "big endian" oder 
"low endian" ist.

Autor: Jim Meba (turboj)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
>> beim Füllen "htonl" verwenden.
> Kommt darauf an ob der verwendete Rechner/Prozessor "big endian" oder
> "low endian" ist.

Nicht, wenn man htonl() verwendet. Das soll die "network byte order" 
herstellen, d.h. "big endian" wie es der OP haben will.
Außerdem heisst das Gegenteil "little endian".

Autor: olpo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
och, das läuft auf einem µC; ich würde es lieber per Hand machen.
Ob Big- oder Little Ending kann ich ja schnell ausprobieren.

Autor: DirkB (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Schieben und maskieren.
Array[0] = (Variable >> 24) & 0xff;
Array[1] = (Variable >> 16) & 0xff;
Array[2] = (Variable >>  8) & 0xff;
Array[3] = (Variable      ) & 0xff;

Autor: Rolf Magnus (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Εrnst B✶ schrieb:
> union aus uint32_t und uint8_t[4].

Das ist abgesehen davon, daß es in C eigentlich verboten ist, auch recht 
umständlich. Da würde ich lieber einen Pointer-Cast machen.

DirkB schrieb:
> Schieben und maskieren.

Das ist auch endian-unabhängig, wird aber vom Compiler auf manchen µCs 
nicht optimal umgesetzt.

Autor: Honkihonkohonkahu (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Das ist abgesehen davon, daß es in C eigentlich verboten ist, auch recht
> umständlich.

In MISRA-C ist es vielleicht verboten aber warum soll das in C89 
und/oder C99 verboten sein?

Rolf Magnus schrieb:
> Da würde ich lieber einen Pointer-Cast machen.

Ack

Autor: Stefan Ernst (sternst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Honkihonkohonkahu schrieb:
> In MISRA-C ist es vielleicht verboten aber warum soll das in C89
> und/oder C99 verboten sein?

Weil der C-Standard eigentlich ausdrücklich sagt, dass man aus einer 
Union nur denjenigen Member lesen darf, der auch als letztes beschrieben 
wurde.

Autor: Honkihonkohonkahu (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Stefan Ernst schrieb:
> Weil der C-Standard eigentlich ausdrücklich sagt, dass man aus einer
> Union nur denjenigen Member lesen darf, der auch als letztes beschrieben
> wurde.

Ergibt Sinn, ich sollte wohl um diese Uhrzeit wohl nicht zu allem meinen 
Senf dazu geben ;)

Autor: olpo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Also, die "sauberste" Methode ist tatsächlich der böse Pionter-Cast?

Autor: Simon K. (simon) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Das ist die sauberste Methode, weil man damit genau sagt, welches Byte 
wo hin soll. Durch Pointerbastelei oder Unionbastelei kann man 
unterschiedliche Ergebnisse, je nach Compiler, Plattform, etc bekommen.

DirkB schrieb:
> Schieben und maskieren.
>
> Array[0] = (Variable >> 24) & 0xff;
> Array[1] = (Variable >> 16) & 0xff;
> Array[2] = (Variable >>  8) & 0xff;
> Array[3] = (Variable      ) & 0xff;
> 

Autor: DirkB (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Wenn die CPU keinen Barrel-Shifter hat, kann man ja auch mit einer 
Hilfsvariablen arbeiten und die dann jeweils 8 Stellen verschiebt.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
DirkB schrieb:
> Wenn die CPU keinen Barrel-Shifter hat, kann man ja auch mit einer
> Hilfsvariablen arbeiten und die dann jeweils 8 Stellen verschiebt

das wird der compiler wohl von alleine optimieren.
Ich könnte wetten, dass im Assembly kein einzige(r) Shift oder 
Maskierung enthalten ist.

Autor: Simon K. (simon) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
DirkB schrieb:
> Wenn die CPU keinen Barrel-Shifter hat, kann man ja auch mit einer
> Hilfsvariablen arbeiten und die dann jeweils 8 Stellen verschiebt.

Unsinn. Dieser C-Code wird in 99.9% aller Fälle in 0 Extra-Instruktionen 
umgesetzt. Gleichzeitig hat man sauber definiert, was wo landen soll. 
Also -> saubere Lösung.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net