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


von Bert (Gast)


Lesenswert?

Ich habe folgende Situation:
1
uint8_t offtime = 0;
2
3
offtime = (11*wert)/2 // bei maximal möglichem Wert 36
4
5
--> 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.

von crazy horse (Gast)


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).

von Andreas K. (a-k)


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.

von Bert (Gast)


Lesenswert?

Sorry, ich habe einen Atmel Prozessor und programiere mit AVRGCC

von crazy horse (Gast)


Lesenswert?

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

von Bert (Gast)


Lesenswert?

Danke für Eure Hilfe.

Ist es also sicherer eine uint16_t-Variable einzubauen?

von crazy horse (Gast)


Lesenswert?

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

von eProfi (Gast)


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.

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.