mikrocontroller.net

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


Autor: hans gerlach (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der inoffizielle WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Autor: hans gerlach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
welche

Autor: The Daz (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]);

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: hans gerlach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank, werds mit ne runion machen, sieht wirklich elegant aus.
vielen dank!

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Union (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unions sind ziemlich sinnlos ;)

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

Autor: Reinhard B. (brainstorm)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.