Forum: Compiler & IDEs If Abfrage funktioniert nicht


von Manuel (Gast)


Lesenswert?

Hallo,
programmiere schon länger die atmegas von Atmel. Benutze derzeit das 
AVR-Studio 6 mit dem beiligendem gcc und mir hat sich neulich eine Frage 
aufgetan.
Wenn ich folgende IF-Abfrage gestalte:
1
if(V1 >= (5*1000*100))
2
{}

V1 ist eine unsigned long Variable und definitiv größer als 500000.
Trotzdem springt er nicht in den Codeblock rein. Warum nicht?

Ähnliches Problem:
1
V2 = V1 - (5*1000*100);

Übertragsbildung. Da kommen ganz komische Werte raus, aber nicht die 
Differenz. Es liegt an dem Ausdruck in der Klammer. Wenn ich statt 
(5*1000*100) 500000 schreibe funktioniert alles tadelos.

Wodran liegt das? Nimmt der Compiler die Zahlen nicht als unsigned long 
auf und entstehen dadruch die Fehler ?

Grüße

von Stefan E. (sternst)


Lesenswert?

Manuel schrieb:
> Nimmt der Compiler die Zahlen nicht als unsigned long
> auf und entstehen dadruch die Fehler ?

Warum sollte er? Das Innere der Klammer wird zuerst ausgerechnet, und 
dabei interessiert es nicht die Bohne, was außerhalb der Klammer steht. 
Alle beteiligten Operanden in der Klammer sind int, also wird in int 
gerechnet.

von Fabian O. (xfr)


Lesenswert?

Der Compiler berechnet die Konstanten als int, also auf dem AVR nur mit 
16 Bit. Abhilfe: Eine der Konstanten explizit als long bzw. unsigned 
long angeben:
1
V2 = V1 - (5L*1000*100);
bzw.
1
V2 = V1 - (5UL*1000*100);

von Yalu X. (yalu) (Moderator)


Lesenswert?

500000₁₀ = 111 1010 0001 0010 0000₂

auf 16 Bit (Größe von int) gekürzt sind das

1010 0001 0010 0000₂ = -24288

auf 32 Bit erweitert ergibt sich

1111 1111 1111 1111 1010 0001 0010 0000₂

als vorzeichenlose Zahl betrachtet, ist das

4294943008₁₀

V1 muss also schon sehr groß sein, damit die If-bedingung erfüllt ist.

Immer daran denken: Die verwendete Wertebereich für arithmetische 
Operationen in C ergibt sich aus den Datentypen der Operanden, nicht 
der Ergebnisvariable.

von Manuel (Gast)


Lesenswert?

Vielen Dank für die vielen und schnellen Antworten, jetzt ist mir alles 
klar. Hab sowas schon vermutet.

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.