16bit -> 2*8bit und 2*8bit -> 16bit

OP #1028771
Guten Morgen,

komme mit der umrechnung nicht klar. Hoffe Ihr könnt mir helfen.

AVR M8515 und CVAVR


16bit Zahl in 2 8bit zerlegen:

Sender:
Adresse ist 16bit

Data[0] = Adresse >> 8;
Data[1] = (char) Adresse;
-------------------------------------------

Empfänger:
Adresse ist wieder 16bit

Adresse = Data[0]<<8 + Data[1];



nur leider stimmt das Ergebnis nicht. Wo liegt mein Fehler ?


Danke, Markus
Gast #1028808
Das ist kein Angstcast, das muss einfach vorher sein:
1
Adresse =   (  (uint16_t) Data[0] << 8 )
2
          | (  (uint16_t) Data[1]      );

Wobei man einen der beiden Casts weglassen kann.
Gast #1028853
Das Problem ist die Priorität von << und +.

Der Compiler rechnet nämlich die Zeile
Adresse = Data[0]<<8 + Data[1];

so:
Adresse = Data[0]<<(8 + Data[1]);

Du brauchst nur eine Klammer, nämlich so:
Adresse = (Data[0]<<8) + Data[1];

Richtig rechnet er ohne Klammer so:
Adresse = Data[0]*256 + Data[1];

Denn hier gilt PvS (Punkt vor Strich).



Da auf einem 8-bit-Rechner das ganze Geschiebe überflüssig ist, würde 
ich eine union empfehlen. Habe ich ja schon oft genug hier gepostet.
#1028870
Klammern sind notwendig, weil die Addition eine höhere Priorität als der 
Shift-Operator hat. Auf einem 8-Bit-Rechner sollte man zudem 
sicherstellen, dass die Shift-Operation nicht in 8 Bit ausgeführt wird, 
weil sonst die Bits im Nirwana verschwinden. Ein expliziter Cast auf 
16-Bit ist sicher nicht falsch.

Halbwegs ordentliche Compiler sind in der Lage, einen Shift um 8-Bits 
einen Kopierbefehl zu optimieren. Ein explizites Handling mit 
union-Datentypen ist daher meist überflüssig.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.