Hallo, kann mir jemand auf die Sprünge helfen, wie ich in winavr ein unsigned char in ein char caste...bzw. ein unsigned long in ein unsigned (nur das niedere byte). Ich will eine Software auf einen Atmega portieren, allerdings werden im code eben unsigned char und unsigned long (32bit) verwendet, in den benötigten avr spezifischen funktionen allerdings char und unsigned für diese beiden Datentypen. Stehe gerade ziemlich auf dem Schlauch...sorry! Grüsse Ralf
unsigned char bla = (unsigned char)abc So kannst du alles casten, der Compiler wird dich nicht daran hindern. Ob's dann auch funzt ist eine andere Frage, daher: Überlegen was du tust ;) Wenn du in einen kleineren Datentypen castest wird immer nur der untere Teil verwendet.
Am besten nicht so viel unsigned longs (avr ist nur 8 bitter). char a_char_var; unsigned char a_uchar_var; void foo( void ) { a_uchar_var = 45; a_char_var = (char) a_uchar_var; // (char) : cast a_char_var = -45; a_uchar_var = (unsigned char) a_char_var; // Hier -45 pass nicht // weil -45 es ist nicht // zwischen 0 und 255 // so du wirst 211 bekomen ! } Beachten: "unsigned" gleich als "unsigned int"
Hallo, danke für Deine Antwort. Wenn du in einen kleineren Datentypen castest wird immer nur der untere Teil verwendet. Das dachte ich auch, aber winavr hat aus meinem 32bit unsigned long gerade das highbyte nach unsigned gecastet. Sonst wäre ich schon feddisch. Mit dem unsigned char nach char hat es sich genauso schwachsinnig verhalten.
Ralf wrote: > Das dachte ich auch, aber winavr hat aus meinem 32bit unsigned long > gerade das highbyte nach unsigned gecastet. Sonst wäre ich schon > feddisch. Mit dem unsigned char nach char hat es sich genauso > schwachsinnig verhalten. Ja so ist das mit den Raterunden und Glaskugeln. Hättest Du einfach mal den Quelltext gepostet, wie Du gecastet hast (nämlich nen Pointer !), dann hätten Dir auch alle gesagt, daß das nicht geht. Peter
...ich glaube gleich erwischst du mich g es war kein pointer...es war ein element aus einem struct...sa ca so aus test(unsigned a, char b) { } void main (void) { struct xyz { unsigned long name; unsigned char adresse; }; test(yxz.name,xyz.adresse); } ja und in a stand dann das höchste byte von name drin...in b weiss ich gar nicht mehr.
>test(yxz.name,xyz.adresse);
Und wo hast du dann gecastet ? Nirgends.
Und möglicherweise sogar a mit b vertauscht.
>Und wo hast du dann gecastet ? Nirgends.
ich habe nicht expliziet gecastet...eigentlich bin ich von ausgegangen,
dass winavr von unsigned long nach unsigned impliziet castet...und da
wie Philip schon sagte den unteren teil, wenn auf ein kleineren Datentyp
gecastet wird. Das war aber eben nicht der fall.
exakt kam bei raus:
aus 0x00000001 wurde 0x0000
aber aus
0x00100000 wurde 0x0010
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.