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?
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.