www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Cast von [unsigned char] zu [int] MIT Vorzeichenflag


Autor: Alexander I. (daedalus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Erstmal ein Stückchen Code:
IntToCharArray(int number, char* string)
{
 /*
 Diese Funktion wandelt einen Int in eine char-Zeichenkette unter Beachtung  
 des Vorzeichens. Bsp: 534 -> "534", -93 -> "-93", usw.
 */
}

main
{
 unsigned char c=0xF1;
 char mystring[5];
 IntToCharArray(c, mystring); // Ergebnis: "241"
 IntToCharArray((char)c, mystring); // Ergebnis: "241"
 IntToCharArray((int)c, mystring); // Ergebnis: "241"
}


Jetzt ist ja das oberste Bit von c gesetzt, da der Wert >0x7F ist, somit 
ist das Vorzeichen gesetzt und die gewünschte Ausgabe wäre -113. Wie muß 
ich von uchar nach int casten, damit das MSB vom uchar als Vorzeichenbit 
vom Int interpretiert wird? Gibts da eine einfache Lösung oder muß ich 
mir ne Konvertierungsfunktion schreiben?

Vielleicht könnt ihr mir ja helfen? Danke im Vorraus.

Autor: PM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, Du must einfach signed char verwenden. Dann klappt das auch mit dem 
Vorzeichen. So wie Dein Programm geschrieben ist macht er das völlig 
richtig, den unsigned char hat keine Vorzeichenbit und kann nur positive 
Zahlen enthalten.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das geht mit nem Zeiger
char *d;
unsigned char c = 0xf1;
d = (char*)&c;
IntToCharArray(*d, mystring); // Ergebnis: "-113"

So müsste das gehen. Das kannst dann in int casten

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

Bewertung
0 lesenswert
nicht lesenswert
> Wie muß ich von uchar nach int casten

Über einen 'cast-Umweg' der über signed char führt.

  uchar -> signed char -> int

d.h. wenn bei dir ein char als signed char geführt wird,
dann sollte das hier

 IntToCharArray((char)c, mystring);

eigentlich schon die Lösung sein. Wenn nicht dann mach

 IntToCharArray((signed char)c, mystring);

draus.
Wenns dann immer noch nicht klappt, könnte der Fehler irgendwo
in der Funktion IntToCharArray liegen (hast du keine fertige
Funktion itoa()?)

Autor: Alexander I. (daedalus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Die Idee über den Char-Umweg hatte ich ja auch, aber das hier 
funktioniert definitiv nicht:
 IntToCharArray((char)c, mystring);

Allerdings funktioniert die 2. Variante!
 IntToCharArray((signed char)c, mystring);

Ich verwende kein itoa weil mir die stdlib rund 4K ROM weg frisst :)

Vielen Dank soweit, die Variante über den Pointer geht natürlich auch.

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

Bewertung
0 lesenswert
nicht lesenswert
Alex Wurst wrote:
> Hallo,
>
> Die Idee über den Char-Umweg hatte ich ja auch, aber das hier
> funktioniert definitiv nicht:
>  IntToCharArray((char)c, mystring);

Dann ist 'char' bei dir standardmässig ein 'unsigned char'
>
> Allerdings funktioniert die 2. Variante!
>  IntToCharArray((signed char)c, mystring);

Gut.
Und wieder bewahrheitet sich die alte Regel: Sag was du meinst.
Du willst einen char mit Vorzeichen -> signed char

>
> Ich verwende kein itoa weil mir die stdlib rund 4K ROM weg frisst :)
>

Hmm. Glaub ich dir. Sollte allerdings nicht sein. So ein einsamer
itoa() sollte eigentlich nicht dazu führen, dass die komplette
stdlib mit reingezogen wird.

> Vielen Dank soweit, die Variante über den Pointer geht natürlich auch.

Ist aber IMHO die umständlichste und uneleganteste Lösung.

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.