If Abfrage funktioniert nicht

Gast #3301328
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
Moderator #3301356
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren