Forum: Mikrocontroller und Digitale Elektronik casten von signed int nach unsigned char


von Gast (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Andi (Gast)


Lesenswert?

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.

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

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.

von OliverSo (Gast)


Lesenswert?

union signedint_to_bytes
{
  int signed_int;
  unsigned char bytes[2];
};

(für 16-bit integer)

Oliver

von Karl heinz B. (kbucheg)


Lesenswert?

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 );



von fieser, klugscheissender Rahul (Gast)


Lesenswert?

>Wert = ( int )( ( Byte1 << 8 ) | Byte2 );

Geht also doch so.

von Karl heinz B. (kbucheg)


Lesenswert?

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