mikrocontroller.net

Forum: Compiler & IDEs Vorzeichenproblem


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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
    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

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.