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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.