rechnfehler mit standartrechnung uint32_t

Gast #4483521
Lesenswert?
• ▲
▼
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 #4483541
Lesenswert?
• ▲
▼
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.
#4483556
Lesenswert?
• ▲
▼
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 #4483574
Lesenswert?
• ▲
▼
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 #4483578
Lesenswert?
• ▲
▼
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.
#4483591
Lesenswert?
• ▲
▼
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

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.