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


von Alexander I. (daedalus)


Lesenswert?

Hallo,

Erstmal ein Stückchen Code:
1
IntToCharArray(int number, char* string)
2
{
3
 /*
4
 Diese Funktion wandelt einen Int in eine char-Zeichenkette unter Beachtung  
5
 des Vorzeichens. Bsp: 534 -> "534", -93 -> "-93", usw.
6
 */
7
}
8
9
main
10
{
11
 unsigned char c=0xF1;
12
 char mystring[5];
13
 IntToCharArray(c, mystring); // Ergebnis: "241"
14
 IntToCharArray((char)c, mystring); // Ergebnis: "241"
15
 IntToCharArray((int)c, mystring); // Ergebnis: "241"
16
}

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.

von PM (Gast)


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.

von Daniel (Gast)


Lesenswert?

Also das geht mit nem Zeiger
1
char *d;
2
unsigned char c = 0xf1;
3
d = (char*)&c;
4
IntToCharArray(*d, mystring); // Ergebnis: "-113"

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

von Karl H. (kbuchegg)


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()?)

von Alexander I. (daedalus)


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.

von Karl H. (kbuchegg)


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.

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.