Rechnen unsigned long x unsigned long

Hallo liebes Forum!
Das ich für Zahlen Größer 32.767 kein int sondern unsigned long zu verwenden habe, habe ich hier im Forum herausgefunden.
Das man mit einem unsigned long nur Rechnen kann, wenn man hinter einen Operanten ein "UL" schreibt auch.
Abbber....
Wenn ich mit den unsigned long variablen weiterrechnen möchte, läuft irgendwas schief.
Hat jemand einen Tipp, woran das liegen könnte?

unsigned long x = 0;
unsigned long y = 0;

void setup() 
{
  Serial.begin(9600);
  x = 60*60*1000UL;
  y = x*100*100UL;

  Serial.print("x ");
  Serial.println(x);
  Serial.print("y ");
  Serial.println(y);
}

void loop() 
{

}

x 3600000 (richtig)
y 1640261632 (?)

Mit solchen Multiplikationen bekommt man auch beim unsigned long einen Überlauf hin.

Typisch: Wertebereichsüberschreitung!


template<typename T>  char* bigToStr(char* buffer, T value, uint8_t base = 10)
{
  bool negative = value < 0;
  if(negative) value *= -1LL;

  //char* ptr = buffer+BufferSize;
  char* ptr = buffer+sizeof(value)*8+1+1; // buffergroesse berechnen, size * 8bit +Vorzeichen +NullByte
  *(--ptr)  = 0;
  switch(base)
  {

    case  2: while(value) // BINARY
             {
               *(--ptr)  = '0' + (value & 0x01);
               value >>= 1;
             }
             break;
             
    case  8: while(value) // OKTAL
             {
               *(--ptr)  = '0' + (value & 0x07);
               value >>= 3;
             }
             break;
             
    case 16: while(value) // HEX
             {
               *(--ptr)  = '0' + (value & 0x0f);
               if(*ptr > '9') *ptr += 'A'-'9'-1;
               value >>= 4;
             }
             break;
           
    default: while(value) // UNIVERSAL
             {
               uint8_t rest = value % base;
               *(--ptr)  = '0' + rest;
               if(*ptr > '9') *ptr += 'A'-'9'-1;
               value /= base;
             }
             break;
  }
  if(negative)  *(--ptr)  = '-';
  return ptr;
}



unsigned long long x = 0;
unsigned long long y = 0;
unsigned long test = -1;

void setup() 
{
  Serial.begin(9600);
  x = 60ULL*60*1000;
  y = x*100*100;


  char buffer[100];

  Serial.print("test ");
  Serial.println(test);
  
  Serial.print("x ");
  Serial.println(bigToStr(buffer,x));
  
  Serial.print("y ");
  Serial.println(bigToStr(buffer,y));

}

void loop() 
{

}

bigToStr() funktioniert hier, bedarf aber noch einer Überarbeitung.

image

Du hast einen Überlauf

@wwerner: Du hast eine Null zu viel: 60 x 60 x 1000 x 100 x 100 = 36.000.000.000

Sonst stimme ich Dir zu.

@Tiff: Lesestoff unsigned long

Vielen Lieben Dank!
Und gleich mit einer Lösung!
verbeugt sich
Dankesehr!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.