Staunen über Compiler

Gast #3693712
Lesenswert?
• ▲
▼
Hi, bin am programmieren (AVR Studio 6 / ATtiny 84) und staune mal 
wieder über den Compiler:
1
        if(Taste == up) Frequenz += Offset;
2
        if(Frequenz > 999999999999) Frequenz -= Offset;
3
        if(Taste == down) Frequenz -= Offset;
4
        if(Frequenz < 0) Frequenz += Offset;
Das war meine erste Version.

Diese zweite Version hier spart 124 Byte Programm Memory!!!
1
        if((Taste == up) && ((Frequenz + Offset) <= 999999999999)) Frequenz += Offset;
2
        if((Taste == down) && ((Frequenz - Offset) >= 0)) Frequenz -= Offset;
Kann es z.B. sein, das der Compiler das Zwischenergebnis
(Frequenz + Offset)
aus dem Vergleich für die Zuweisung += speichert?!
#3693747
Lesenswert?
• ▲
▼
Peter Zz schrieb:
> Kann es z.B. sein, das der Compiler das Zwischenergebnis
> (Frequenz + Offset)
> aus dem Vergleich für die Zuweisung += speichert?!

Kann sein, siehst Du wenn Du nach Assembler compilierst.

Dir ist aber auch klar, das die beiden Code-Schnipsel nicht ganz genau 
die gleiche Funktion haben, oder? (im ersten Code geht das Programm aus 
einem nicht-validen Zustand automatisch in einen gültigen, beim 2ten 
nicht)
#3693771
Lesenswert?
• ▲
▼
Worüber ich erst einmal staune ist die 999999999999. Das ist hexadezimal 
0xE8D4A50FFF, also 5 Bytes. Meines Wissens nach nimmt der Compiler 
standardmäßig für ein solches Literal den kleinsten Integer-Typ an, der 
den Wert noch repräsentieren kann. In diesem Fall wären das wohl 8 Bytes 
bzw. 64 Bit. Ist das wirklich das was Du willst?

Ich würde mir erst einmal Klarheit über die beteiligten Wertebereiche 
verschaffen. Dann kannst Du Dir das was der Compilers daraus macht im 
Assemblercode ansehen.
Gast #3693793
Lesenswert?
• ▲
▼
dumdi dum schrieb:
> Dir ist aber auch klar, das die beiden Code-Schnipsel nicht ganz genau
> die gleiche Funktion haben, oder? (im ersten Code geht das Programm aus
> einem nicht-validen Zustand automatisch in einen gültigen, beim 2ten
> nicht)

Ups, jetzt seh ich es auch!
Hat sich bisher nur nicht böse auswirken können, da beim Lesen aus dem 
Eeprom Werte außerhalb des gültigen Bereiches abgefangen werden:
1
  signed long long int Frequenz;
2

3
  eeprom_read_block(&Frequenz,&Eeprom_1,sizeof(Frequenz));
4
  if(Frequenz > 999999999999) Frequenz = 0;

Antwort schreiben

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