Forum: Mikrocontroller und Digitale Elektronik char arry zu unit_16t


von Johannes (Gast)


Lesenswert?

Hallo,

ich habe hier ein Array als char mit 2 Werten und würde gerne die Bits 
1zu1 gerne in ein uint_16t schieben.

Also Bsp:
char[0]=0xFF;
char[1]=0xEE;

Wird zu

uint_16t 0xFFEE

Wie stelle ich soetwas am besten für einen AVR in GCC an?

von Karl H. (kbuchegg)


Lesenswert?

1
  ergebnis = ( byte[0] << 8 ) + byte[1];

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Karl H. schrieb:
> byte[0] << 8
Ist das, wenn byte ein char ist, nicht immer 0?
Oder erweitert das der Compiler diesen char gleich auf den 
Ergebnisdatentyp? Mache ich da den (uint16_t)byte[0]-Cast immer 
unnötigerwese hin?

Edit: selber ausprobiert, dazugelernt...  ;-)
http://codepad.org/lhuXkpKj

von da1l6 (Gast)


Lesenswert?

Lothar M. schrieb:
> Karl H. schrieb:
>> byte[0] << 8
> Ist das, wenn byte ein char ist, nicht immer 0?
> Oder erweitert das der Compiler diesen char gleich auf den
> Ergebnisdatentyp? Mache ich da den (uint16_t)byte[0]-Cast immer
> unnötigerwese hin?

C garantiert das alle Operationen mindestens mit int-Wortbreite 
ablaufen, beim avr also 16 bit. Passt also.


da1l6

von Karl H. (kbuchegg)


Lesenswert?

Lothar M. schrieb:
> Karl H. schrieb:
>> byte[0] << 8
> Ist das, wenn byte ein char ist, nicht immer 0?
> Oder erweitert das der Compiler diesen char gleich auf den
> Ergebnisdatentyp?


Nicht 'Ergebnisdatentyp'.
Wie die rechte Seite einer Zuweisung ausgewertet wird, hängt prinzipiell 
erst mal nicht davon ab, was links steht. Rechts steht eine Expression 
und die wird nach den Regeln umgesetzt.
Eine davon ist: Gerechnet wird nie kleiner als int.
(int war schon immer der Leib und Magen Datentyp in C)

Der Datentyp links ist allerdings nicht ganz unerheblich, wenn es zu 
Optimierungen kommt. Denn der Compiler kann den rechten Ausdruck auch 
wieder von int auf eine 8 Bit Berechnung zurückstutzen, wenn 
nachgewiesen werden kann, dass das für das Ergebnis keinen Unterschied 
macht. Steht links ein 8 Bit Datentyp, dann geht das natürlich bei 
einigen Operationen in der Expression recht einfach zu zeigen.

> Mache ich da den (uint16_t)byte[0]-Cast immer
> unnötigerwese hin?

unnötig würde ich nicht unbedingt sagen.
Aber notwendig um die Auswertung auf 16 Bit zu hieven ist er nicht. Denn 
das ist sie sowieso.

von Pascal (Gast)


Lesenswert?

Wenn es um die "Weiterverarbeitung" geht, würde ich das mit einer Union 
machen.

union {
   char byte[2];
   uint16_t word;
}

Auch fürs "Rauskopieren" ist das in C wohl die effektivste Variante. 
Wegen little/big endian kennen ich mich auf den AVRs nicht aus, die 
Reihenfolge könnte ev. verkehrt sein.

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.