uint32_t Überlauf bei 32767

OP #2718199
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
}
Gast #2718216
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.

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