Forum: Compiler & IDEs Vorzeichenproblem


von Alex (Gast)


Lesenswert?

Hallo zusammen
Ich habe folgendes Problem. Bei mir wird eine if abfrage nicht richtig 
angegangen.

#define MAX_WINDOWS_SIZE (300-42)

int16_t  maxwindow = MAX_WINDOWS_SIZE;
unsigned long int sd_ausgabe_zaehler;


if(maxwindow-sd_ausgabe_zaehler >=0)
{
  char zwischenspeicher[15];
  ltoa(maxwindow-sd_ausgabe_zaehler,zwischenspeicher,10);
  ausgabe(zwischenspeicher);//<-Negative zahl ausgeben
}


Meine Frage, wie kommt es das er in die if reingeht obwohl der Wert 
negativ ist (er gibt auch negative Werte in Ausgabe aus. Jemand eine 
Idee? Kommen vielleicht long und int nicht miteinander klar? (wäre mir 
zwar neu aber...)

Gruß
Alex

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:

> Meine Frage, wie kommt es das er in die if reingeht obwohl der Wert
> negativ ist

sd_ausgabe_zaehler ist ein unsigned.
maxwindow ist ein signed.

Wenn in einem Ausdruck sowohl unsigned als auch signed vorkommen, dann 
wird der signed Wert zu einem unsigned Wert 'umgewandelt'. Die 
Berechnung selbst wird unsigned gemacht und liefert auch ein unsigned 
Ergebnis

Das Ergebnis deines Ausdrucks kann daher per Definition niemals negativ 
sein, da ein unsigned Wert ja kein Vorzeichen hat und per Definition 
immer positiv ist.

Und damit ergibt
1
    if ( .... >= 0 )

immer TRUE

> (er gibt auch negative Werte in Ausgabe aus.

Aber nur, weil du die falsche Konvertierfunktion ltoa benutzt hast. 
ultoa wäre richtig gewesen :-) Bei ltoa hat der Compiler einen 
impliziten Cast benutzt um das Ergebnis des Ausdrucks in einen signed 
long zu verwandeln.

Manchmal können die automatischen Casts auch nerven :-)


Fazit: Beim Mischen von signed und unsigned in Ausdrücken extrem 
vorsichtig sein. Es gewinnt immer unsigned.

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.