Warum verrechnen sich itoa, atoi und printf ?

Gast #364672
Lesenswert?
• ▲
▼
Hallo an alle,

ich sitze jetzt schon 3 Tage an einem Problem und bekomme es nicht
gelöst. Hier der Code:

uint32_t x = 25123 ;    // unsigned long int
uint8_t y [ 7 ] ;       // Zeichen-Array

itoa ( x, y, 10 ) ;     // einmal hin...
x = atoi ( y ) ;        // und wieder zurück

printf ("itoa - atoi %lu", x ) ;  // gibt Unsinn aus, wenn x>2^15

lcd_gotoxy (0, 0) ;
lcd_puts (y) ;                    // zeigt den gleiche Rechenfehler

Für x=0 bis 32768, also 2^15 funktioniert alles prima, von da ab,
kommen falsche Ergebnisse.

Sieht also aus, wie ein Vorzeichen-Problem, aber ich habe x als
unsigned definiert. Der Fehler tritt bereits bei itoa auf, wie das LCD
zeigt.

Was mache ich falch ?

Danke für  Euere Mühe
#364673
Lesenswert?
• ▲
▼
öffne mal stdlib.h und da wirst du sehen

extern char *itoa(int __val, char *__s, int __radix);

extern char *ltoa(long int __val, char *__s, int __radix);

das zb. itoa() einen int als Parameter verlangt, also einen int16_t.
Naja, und gleich nach dessen Deklaration findest du auch die Lösung für
dein Problem.

Gruß Hagen
Gast #364675
Lesenswert?
• ▲
▼
>Was mache ich falsch?

Du hast die Deklaration der Funktion itoa nicht beachtet.
Sie erwartet einen signed int da kommst du auf der positiven Seite nur
bis 2^15.
nimm ltoa (long) dieser hat einen größeren Wertebereich oder noch
besser
ultoa (unsigned long)

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.