Cast von [unsigned char] zu [int] MIT Vorzeichenflag

OP #612395
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.
Gast #612419
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.
#612425
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()?)
OP #612433
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.
#612442
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren