www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Integer-Berechnung - Wann Overflow?


Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe folgende Situation:
uint8_t offtime = 0;

offtime = (11*wert)/2 // bei maximal möglichem Wert 36

--> 11*36 = 396 --> 396/2 = 198


Was kommt bei der Berechnung raus bzw was steht in der Variablen?

396 übersteigt ja den Bereich von offtime (0...255), allerdings nach der 
Berechnung liegt es im Bereich. Wann wird ein Wert der Variablen 
übergeben?

Kann ich obige Rechnung anwenden oder muss ich daraus eine 16-bit 
Variable machen? Wird die Rechnung zuerst ausgeführt und zum Schluss 
übergeben oder muss "während der Berechnung" der Wertebereich der 
Variable stimmen?

Mir geht es um eine generelle Antwort, also um die Funbktionsweise der 
Wertübergabe. Ich weiß das ich einfach eine 16Bit Variable machen kann. 
Aber ich möchte den Prozess des µC verstehen.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
natürlich muss du daraus eine 16bit-Rechnung machen. Beliebter Fehler, 
wenn Zwischenergebnisse den Wertebereich überschreiten, du denkst 
immerhin vorher dran :-)
Bie dir wird wohl sonst 70 herauskommen (11*36=0x18c, es wird nur mit 
0x8c weitergerechnet).

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist völlig korrekt so, explizite Konvertierung zu 16-Bit Typen ist nicht 
erforderlich.

In (Standard-) C wird Arithmetik immer mindestens mit Breite "int" 
durchgeführt, auch wenn alle Operanden kleiner sind. Daher tritt kein 
Overflow auf. Eine Optimierung zu 8 Bit breiter Rechnung ist nur 
zulässig, wenn das gleiche Ergebnis dabei herauskommt.

Es gibt allerdings Compiler für 8-bit Microcontroller, die sich 
zumindest in der Standardeinstellung nicht konform zum C Standard 
verhalten und bei denen hier ein Überlauf auftreten kann. GCC gehört 
aber nicht dazu.

Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, ich habe einen Atmel Prozessor und programiere mit AVRGCC

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
offtime = (int) 11*wert/2;
Sollte korrekt rechnen und offtime kann eine 8bit-Variable bleiben.

Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Eure Hilfe.

Ist es also sicherer eine uint16_t-Variable einzubauen?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein, es reicht, wenn die Berechnung selbst mit int-cast ausgeführt 
wird, belegt dann nur temporär 16bit.

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, es kommt auf die Definition von "wert" an (8 oder 16 Bit).
Das gibt die Breite der Berechnung vor.
Das Ergebnis wird dann auf die Bitlänge von "offtime" abgeschnitten.

Kommt auf den Compiler an, am einfachsten ausprobieren bzw. generierten 
ASM-Code analysieren.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.