schwerer Rechenfehler

Gast #364362
Lesenswert?
• ▲
▼
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 #364366
Lesenswert?
• ▲
▼
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
#364367
Lesenswert?
• ▲
▼
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 #364370
Lesenswert?
• ▲
▼
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 #364371
Lesenswert?
• ▲
▼
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

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.