rechnfehler mit standartrechnung uint32_t

Gast #4483521
programm rechnet falsch, bin ich zu blöd oder was? :-)


#include "suart.h"
#include "string.h"
#include "sms.h"
#include <stdint.h>

volatile uint32_t min=0;
char zahl_buffer[7];

uint32_t getMinuten()
{
  stunde=1;
  monat=1;
  minute=1;
  jahr=0;
  min=1+(1*60)+(1*30*60*24)+(1*365*24*60);
  return min;
}


ergebnis: 4294946333 anstatt: 568861
Gast
hallo Be Stucki, ich habe extra alle variablen entfernt. die 
zielvariable kommt direkt nach uint32t: min und trotzdem habe ich das 
falsche ergebnis.

komisch.
Gast
an der stand-art liegts sicher nicht.

was für eine platform ist das? anscheinend ist dort int nur 16bit gross, 
dann rechnet er also in 16 bit int, und interpretiert das am schluss als 
uint32_t, da kommt dann genau das raus.

häng an die zahlen "ul" an, dann gehts ohne überlauf.
Gast
> programm rechnet falsch

Das Programm rechnet überhaupt nicht. Es ist unvollständig.

> bin ich zu blöd oder was? :-)

Dem ersten Teil kann ich nur zustimmen :)
Christian schrieb:
> hallo Be Stucki, ich habe extra alle variablen entfernt. die
> zielvariable kommt direkt nach uint32t: min und trotzdem habe ich das
> falsche ergebnis.
1
uint32_t WertA = 1; /* 1 ist ein int */
2
uint32_t WertB = INT_MAX * INT_MAX; /* das Ergebnis ist ein int */
3
uint32_t WertC = 1U; /* 1 ist ein unsigned int */
4
uint32_t WertD = UINT32_C(1) /* 1 ist 32 Bit breit */

Genau hier liegt dein Problem. Eine Zahl ist erstmal ein int. Wird damit 
gerechnet, ist es immernoch ein int. Ist das Ergebnis zu gross für einen 
int, gibts ein Überlauf, das Ergebnis ist immernoch ein int. Du als 
Programmierer bist dafür verantwortlich, dass das Ergebis und auch alle 
Zwischenergebnisse einer Berechnung mit dem jeweiligen Datentyp 
repräsentierbar sind. Schau dir dazu die integer promotions an.

Christian schrieb:
> ich programmiere einen atmega16.

Dann ist dein int 16 Bit breit und ich habe richtig geraten.
Gast
Christian,

doch Du musst nur 1ul oder 1uul schreiben.
Und nun rate mal wo das steht ?
In einem C Buch - die Standard.

Man könnte auch zur besseren Übersicht jede erste Zahl Casten:
1
((uint32_t)1..)
Gast
Christian,

was soll ich von deinen Fähigkeiten halten, wenn man das neurale Element 
der Multiplikation - die 1 - in eine Multiplikation auch schreibt ?
Ok, den Präprozessor wird das nicht interessieren, aber dort stehen nur 
Konstanten, die kann man auch selbst als Ausdruck hinschreiben.
Karl M. schrieb:
> was soll ich von deinen Fähigkeiten halten, wenn man das neurale Element
> der Multiplikation - die 1 - in eine Multiplikation auch schreibt ?

Da es sich offensichtlich um einen verkürzten Beispielcode zur 
Illustration des Problems handelt ist diese Kritik hier fehl am Platz.

> Ok, den Präprozessor wird das nicht interessieren

Solltest du zu jenen gehören, die der Ansicht sind, dass der 
Präprozessor irgend etwas mit hier relevanten Teil des Codes zu tun hat, 
dann solltest du lieber selber mal das C Handbuch studieren und über die 
Rolle des Präprozessors nachdenken.

Antwort schreiben

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