Forum: Compiler & IDEs schwerer Rechenfehler


von Otto Richter (Gast)


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

von peter dannegger (Gast)


Lesenswert?

%u (wie unsigned)


Peter

von Karl H. (kbuchegg)


Lesenswert?

> Was mache ich falsch ?

Du hast keine Doku gelesen sondern einfach was angenommen.

%i   ist fuer 'vorzeichenbehaftete' Zahlen.
%u   ist fuer 'unsigned'

von Otto Richter (Gast)


Lesenswert?

Hi Peter,

..hab ich natürlich probiert, macht aber die gleichen Fehler.

Trotzdem danke für Deine schnelle Antwort

Otto

von Otto Richter (Gast)


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

von Karl H. (kbuchegg)


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

von Karl H. (kbuchegg)


Lesenswert?

> gleiche Compiler-Warnung

Welche?

von Karl H. (kbuchegg)


Lesenswert?

Hab's schon gesehen, du hast die Warnung im Pgm
als Kommentar reingeschreieben.

Poste doch mal Deinen richtigen, kompletten Code. Nicht
nur einen Ausschnitt.

von Otto Richter (Gast)


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

von peter dannegger (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.