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

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