Forum: Mikrocontroller und Digitale Elektronik uint32_t Überlauf bei 32767


von Georg S. (baltron)


Lesenswert?

Hallo,

habe einen Mega2560 Arduino mit LCD Display Shield, den ich aber mit GCC 
programmiere. Für das Display nutze ich die LCD Library von Peter 
Fleury.

Bin beim programmieren auf folgendes Problem gestoßen:
ich definiere eine Variable als i als uint32_t (0...4294967295). Nun 
inkrementiere ich i und lasse sie mir auf dem Display ausgeben. Dabei 
beobachte ich, dass schon bei 32676+1 ein Überlauf stattfindet und die 
Anzeige auf dem Display von -32768 hochzählt.
Woran liegt das, kommt die Funktion itoa nicht mit den Datentypen aus 
der stdint.h zurecht oder ist es was anderes?

Gruß,
Georg
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <avr/pgmspace.h>
4
#include "lcd.h"
5
#include <util/delay.h>
6
#include <stdint.h>
7
8
int main(void)
9
{
10
11
uint32_t i=32765;
12
char buffer[16];
13
lcd_init(LCD_DISP_ON);
14
  
15
for (;;i+=1)
16
 {
17
   itoa(i, buffer, 10);
18
   lcd_puts(buffer);
19
  _delay_ms(1000);
20
 }
21
}

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

was bedeutet itoa hä?
nachdenken!

Grüsse

von ultoa (Gast)


Lesenswert?

ultoa

von Georg S. (baltron)


Lesenswert?

Die Lösung kann wirklich so einfach sein,
danke!

von Sam P. (Gast)


Lesenswert?

Guck dir den Prototypen für itoa an. Vermutlich ist das erste Argument 
ein int, und somit wird dein sorgfältig vorbereiteter uint32_t vom 
Compiler implizit zu int gecastet. An der Stelle tritt der 
Präzisionsverlust auf.

Zur Not mach es per Hand, ist so schwer auch nicht:
1
int32_t num = 1234567;
2
char buffer[16];
3
buffer[15] = 0;
4
int pos = 14;
5
while (num != 0 && pos >= 0) {
6
    buffer[pos] = (num%10) + '0';
7
    num = num / 10;
8
    pos--;
9
}
10
pos++;
11
12
lcd_puts(buffer+pos);

Für negative Zahlen muss man das noch etwas anpassen. buffer wird etwas 
ungewöhnlich befüllt, aber dafür wird der Algorithmus einfacher.

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.