(unsigned) long rechenproblem // libc avr atmega8

Gast #1497177
hallo,

ich versuche folgendes programm auf einem atmega8 zum laufen zubekommen

1
//alle variablen sind unsigned long (aus verzweifelung :P)
2

3
jahr=1970;
4
monat=2;
5
tag=2;
6
stunde=0;
7
minute=0;
8
sekunde=0;
9

10
      for(int j=1970;j<jahr;j++)
11
                {
12
                if(j%4==0 && j%100!=0 || j%400==0)       {unix_sekunden+=(366*24*60*60);}
13
        else                     {unix_sekunden+=(365*24*60*60);}
14
                }
15
                
16
        for(int j=1;j<monat;j++)
17
        {
18
        if(j==1 || j==3 || j==5 || j==7 || j==8 || j==10 || j==12)   {unix_sekunden+=(31*24*60*60);}
19
        if(j==4 || j==6 || j==9 || j==11)              {unix_sekunden+=(30*24*60*60);}
20
        if(j==2) {if(j%4==0 && j%100!=0 || j%400==0){unix_sekunden+=(29*24*60*60);} else {unix_sekunden+=(28*24*60*60);}}
21
        }
22

23
        unix_sekunden+=((tag-1)*24*60*60);
24
          unix_sekunden+=(stunde*60*60)-3600;
25
        unix_sekunden+=minute*60;
26
        unix_sekunden+=sekunde;


vorweg: das programm ist richtig und läuft! nur tut es das nicht auf dem 
µC :/

ich vermute das es irgendwas mit den 32ig bitigen long variablen zutun 
hat, da die niederwertigsten 4byte richtig dargestellt werden... die 
anderen 4sind meistens null bzw das 4te zeigt manchmal etwas an(aber 
falsch)


gruß
Gast #1497209
ne die variable hat 32bit. laut libc faq


aber was mir grade in den sinn kommt:
aber wo wird 366*24*60*60 gespeichert bevor es mit der variable 
verrechnet wird?
Moderator (Firma: Titel) Persönliche Seite #1497225
>  laut libc faq
Na gut, falls du es noch nicht gemerkt hast: für welchen Prozessor?

> ne die variable hat 32bit.
Ich hatte von den Konstanten gesprochen (z.B. 366*24*60*60 = 31622400)

> aber wo wird 366*24*60*60 gespeichert bevor es mit der variable
> verrechnet wird?
Es wird vom Compiler vermutlich als 16-Bit Konstante ausgerechnet.
Gast #1497232
>Ich hatte von den Konstanten gesprochen

ups überlesen.
ich werd mal versuchen das irgendwie mit long variablen grade zubiegen


>für welchen Prozessor?
der atmega8 HAT 32bit long variablen..weiß ich da ich sie schon genutzt 
habe :)
#1497297
gast schrieb:
>>Ich hatte von den Konstanten gesprochen
>
> ups überlesen.
> ich werd mal versuchen das irgendwie mit long variablen grade zubiegen
>
>
>>für welchen Prozessor?
> der atmega8 HAT 32bit long variablen..weiß ich da ich sie schon genutzt
> habe :)

Falls du es noch nicht gemerkt hast:
Dem Compiler ist es völlig egal, ob deine Variable 32 Bit hat oder 
nicht. Während er 366*24*60*60 ausrechnet, interessiert ihn das ganz 
einfach nicht. Der Datentyp der Ergebnisvariable ist nie relevant, wenn 
es darum geht festzulegen, welche Operationen für eine Berechnung 
benutzt werden.
Gast #1497302
jo das ist mir schon klar.

ich glaube das zitieren ist hier etwas vom weg abgekommen ^^

viel wichtiger wäre mir...wie löse ich das problem effektiv?
atm fällt mir nur eine schleife ein in der ich jedesmal 2^16 addiere bis 
ich am ziel bin...das wären dann für ein jahr >400 schleifen 
durchgänge...unschön :/
#1497310
gast schrieb:

> viel wichtiger wäre mir...wie löse ich das problem effektiv?

Oh Mann

  366UL*24UL*60UL*60UL

(Eigentlich würde 1 UL schon reichen, aber was solls)

Jetzt rechnet der Compiler diesen Ausdruck mit long Arithmetik aus.

Antwort schreiben

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