If Abfrage funktioniert nicht

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

Eine eigene Frage? Dieser Thread ist über 13 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.