Forum: Mikrocontroller und Digitale Elektronik probleme mit großen zahlen


von A. F. (elagil)


Lesenswert?

hallo,

ich habe zwei probleme, deren ursache ich nicht erkennen kann. Ich 
simuliere übrigens einen attiny45.

1)

ich lasse über dieses programm den debugger vom atmel studio laufen:
Warum ändern sich die Werte von "pos" und "wert" nicht? Wenn ich sie 
innerhalb von main deklariere funktioniert das so, wie es soll.
1
#include <avr/io.h>
2
3
  unsigned int pos = 0;
4
  uint64_t wert=0;
5
  uint64_t komb=0xFFFFFFFF;
6
7
8
int main(void)
9
{
10
  while(1)
11
    {
12
    wert |= (1<<pos);
13
    pos++;
14
    
15
    if(wert>=komb) {
16
      pos=0;
17
      wert=0;
18
    }          
19
    }
20
}

2) nun der fall, dass die variablen in main deklariert sind:
Problem hier: Wenn "pos" den Wert 16 erreicht, Springt "wert" beim 
nächsten mal oder-verknüpfen mit der um pos verschobenen 1 auf 
0xffffffffffffffff! Bis Verschiebung um 15 sind die Werte immer (so wie 
sie sollen) bei 2^pos-1
1
#include <avr/io.h>
2
3
4
5
int main(void)
6
{
7
  unsigned int pos = 0;
8
  uint64_t wert=0;
9
  uint64_t komb=0xFFFFFFFF;
10
11
  while(1)
12
    {
13
    wert |= (1<<pos);
14
    pos++;
15
    
16
    if(wert>=komb) {
17
      pos=0;
18
      wert=0;
19
    }          
20
    }
21
}

was passiert hier?

danke im voraus!

von Peter II (Gast)


Lesenswert?

Adrian Figueroa schrieb:
> Wenn "pos" den Wert 16 erreicht, Springt "wert" beim
> nächsten mal oder-verknüpfen mit der um pos verschobenen 1 auf
> 0xffffffffffffffff!

ja, weil in C alles mit int gerechnet wird. Und int hat hier nun mal 
16bit.


> (1<<pos);

hierst musst du dem comnpiler sagen, der er mit 64bit arbeiten soll

( (uint64_t)1<<pos);

von A. F. (elagil)


Lesenswert?

Oh, alles klar, vielen dank! :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.