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

OP #1028771
Lesenswert?

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 #1028853
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren