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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.