Vorzeichenproblem

Gast #1479841
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
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.