schwerer Rechenfehler

Gast #364362
Hallo da draussen,

ich habe ein Programm, das sich verrechnet.

Ich will aus 5 ASII-Zeichen (Ziffern) eine int machen.
Bei den lower 4 digts klappt es, aber bei dem 10.000er digit
kommt es zu einem Rechenfehler. Hier die wesentlichen Programmzeilen:

uint8_t x ; // hier definiere ich ein ASCII - Zeichen
            // jetzt wandle ich das ASCII-Zeichen in eine int
            // und weil's die 5te Stelle der gesamten int ist, *10000
            // und ausgeben...
            // der gcc gibt eine Warnung: "int Format. anderer
            // Typ Argument (Argument 2)
printf ( "x = %i \r\n ", ( ( x - 48 ) * 10000 ) ) ;
            // das Ergebnis: ab x > 3 (genau ab 32.768, was ja 2^15
            // ist) kommen falsche Ergebnisse der Berechnung.

Was mache ich falsch ?

Vielen Dank für Eure Mühe

Otto
Gast
Hallo Karl Heinz

...ich hab' %u probiert, ich habe auch versucht mit x als unint32_t.
Es kommt immer die gleiche Compiler-Warnung und der gleiche
Rechenfehler. Ich habe auch eine long int als Variable eingeführt und
diese ausgegeben, ergab immer den gleichen Fehler.

Ich weiß nicht, ob der Fehler durch die Berechnung entsteht, oder durch
die Ausgabe.

Trotzdem Danke für Deinen Hinweis,

Otto
1
#include <stdio.h>
2

3
int main()
4
{
5
  char buf[256];
6

7
  uint8_t x; // hier definiere ich ein ASCII - Zeichen
8
            // jetzt wandle ich das ASCII-Zeichen in eine int
9
            // und weil's die 5te Stelle der gesamten int ist, *10000
10
            // und ausgeben...
11
            // der gcc gibt eine Warnung: "int Format. anderer 
12
            // Typ Argument (Argument 2)
13
  x = '0' + 4;
14
  sprintf ( buf, "x = %u", ( ( x - 48 ) * 10000 ) ) ;
15
            // das Ergebnis: ab x > 3 (genau ab 32.768, was ja 2^15 
16
            // ist) kommen falsche Ergebnisse der Berechnung.
17
}

funktioniert so wie es sollte.
%u im Gegensatz zu %i
Gast
An Alle,

...hat sich erledigt. Muss natürlich %u sein anstelle %i !

Ich hatte die Änderungen an der falsche Stelle ausprobiert, sorry,
jetzt  rechnet der uC richtig.

Danke für Eure Bemühungen !

Otto
Gast
Es tut keinem weh, die Warnung exakt und in vollem Wortlaut per
copy+paste reinzustellen, hilft aber ungemein.

Und dann auch sämtliche Quelltextzeilen bis zu dieser Warnung (als
Anhang).


Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 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.