Hallo ich möchte gerne einen signed int in einen unsigned char umwandeln und das ganze auch wieder zurück. Kann mir jemand sagen wie man das explizit macht? Habe schon gecastet in form von (unsigned char)blabla&ffff; (unsigned char)blabla/256; um einen int nach char umzuwandeln. Meine Frage bezieht sich im eigendtlichen auf das Vorzeichen!! Danke für eure Hilfe schon einmal im voraus.
Wobei hast du Probleme?
Das einzige worauf du aufpassen musst ist, dass ein
signed int normalerweise nicht in einen unsigned char
passt (bitmässig).
> Meine Frage bezieht sich im eigendtlichen auf das Vorzeichen!!
Ein unsigned Typ hat per Definition kein Vorzeichen.
Bei diesem cast wird einfach nur das Bitmuster, das im
signed int enthalten ist, auf die entsprechende Bitlänge
eines unsigned char zurechtgestutzt und ... das wars dann
auch schon. Mehr passiert nicht. Das entstehende Bitmuster
kriegt den Datentyp unsigned char zugewiesen und damit
wird dann weitergemacht als ob es schon immer ein unsigned
char gewesen wäre.
Also der Nutzen von dieser Sache eine Variable mit Vorzeichen die den wert -1000 bis 1000 hat soll über den CAN Bus übertragen werden. Bis jetzt hatte ich nur vorzeichenlose Variablen in der Verarbeitung und habe diese in die 8x8 bit der CAN Message je nach länge in die einzelnen Buffer gecastet. So jetzt muss ich das erste mal eine Vorzeichen behaftete Variable übertragen und weis nicht wie ich es machen soll.
Beim Rückcasten sehe eher das Problem: aus 2 unsigned char ein signed int zu machen... Standard ist ja: unsigned int x = ((unsigend int) h <<8) | (unsigned int) l); Einfach ausprobieren, ob das so nicht vielleicht auch mit signed int geht.
union signedint_to_bytes { int signed_int; unsigned char bytes[2]; }; (für 16-bit integer) Oliver
Andi wrote: > Also der Nutzen von dieser Sache eine Variable mit Vorzeichen die den > wert -1000 bis 1000 hat soll über den CAN Bus übertragen werden. Bis > jetzt hatte ich nur vorzeichenlose Variablen in der Verarbeitung und > habe diese in die 8x8 bit der CAN Message je nach länge in die einzelnen > Buffer gecastet. So jetzt muss ich das erste mal eine Vorzeichen > behaftete Variable übertragen und weis nicht wie ich es machen soll. int Wert; unsigned char Byte1, Byte2; Byte1 = ( unsigned char ) ( Wert >> 8 ); Byte2 = ( unsigned char ) ( Wert ); Rückwandlung: Wert = ( int )( ( Byte1 << 8 ) | Byte2 );
>Wert = ( int )( ( Byte1 << 8 ) | Byte2 );
Geht also doch so.
fieser, klugscheissender Rahul wrote: >>Wert = ( int )( ( Byte1 << 8 ) | Byte2 ); > > Geht also doch so. Yep. Das nutzt eine C Regelung aus: Artihmetik wird immer mindestens mit int-Typen gemacht. d.h. auch wenn Byte1 und Byte2 ein unsigned char sind, so wird für Byte1 << 8, der Byte1 zunächst mal auf unsigned int hoch-promoted. Falls der Compiler das nicht macht (nicht standard-conform) dann müsste man nachhelfen Wert = ( int ) ( ( ( unsigned int )( Byte1 << 8 ) ) | Byte2 ); Diese Casts kosten ja keine Laufzeit. Diese Casts sind einfach nur dazu da den Compiler dazu zu bringen das Bitmuster in dem gewünschten Datentyp zu akzeptieren.
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.