mikrocontroller.net

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


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: fieser, klugscheissender Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
union signedint_to_bytes
{
  int signed_int;
  unsigned char bytes[2];
};

(für 16-bit integer)

Oliver

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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 );



Autor: fieser, klugscheissender Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wert = ( int )( ( Byte1 << 8 ) | Byte2 );

Geht also doch so.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.