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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.