www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kleines Rätsel : Overflow läßt sich nicht mit <> erkennen


Autor: Bernd Emmerich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich hab folgenden Code (Atmega64 WinAVR) und ein mysteriöses Problem.
long Overflow;
char plus;
char minus;

Overflow += 3;
if(Overflow > 0) {
  plus = 1;
  minus = 0;
} else {
  plus = 0;
  minus = 1;
}

Nun läuft der Overflow durch und spring von ca. 32.000 auf -32.000.
Nur erkennt dies der ">" Operator nicht.
Sobald Overflow aber die 0 durchläuft (-3,0,3,6,9....) wird der
Wert als positiv oder negativ erkannt.

Wie kann das sein?
Ich seh's ist nicht... mit der Suche konnte ich leider kein
passendes Thema finden... über Hilfe würde ich mich sehr freuen.

Danke & Viele Grüße
Bernd

Autor: Andreas K. (ergoproxy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich mich recht erinnere liegt das an der Größe der Konstanten.

Versuch mal das hier:
long Overflow;
char plus;
char minus;

Overflow += 3;
if(Overflow > ((long) 0)) {
  plus = 1;
  minus = 0;
} else {
  plus = 0;
  minus = 1;
}

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie fragst du ab, dass ein Overflow von 32000 nach -32000 stattfindet?
Ist "long" nicht ein 32 Bit Wert? +/-32k wäre 16 Bit. Vielleicht liegt 
das Problem in dem Bereich(?)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Emmerich wrote:
> Nur erkennt dies der ">" Operator nicht.

Das kann er auch garnicht.
Der Overflow erfolgte doch schon in der Addition und ist damit 
Geschichte.

Du mußt Dir also den Wert vor der Addition merken und damit vergleichen.


Peter

Autor: Andreas K. (ergoproxy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig sehe, dann willer doch nur wissen ob der Wert in 
der Variable positiv oder negativ ist (wobei die 0 eigendlich noch zum 
positiven gehört aber egal). Der Name der Variable ist wohl nur 
overflow, da er diese immer erhöt und deshalb auch immer mal wieder von 
der obersten Grenze auf die unterste umspringt. Natürlich könnte er auch 
einfach das höchste Bit abfragen, da dies ja für das (-) steht ^^

Gruß ErgoProxy

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte mir vorstellen, dass versehentlich nur die unteren 16 Bits der 
Variablen ausgegeben/angzeigt werden. Dann passt das.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas K. wrote:

> Wenn ich mich recht erinnere liegt das an der Größe der Konstanten.

Nein. Die Konstante wird automatisch an den anderen Operanden angepasst.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger wrote:

> Das kann er auch garnicht.

Doch, das kann er schon, wenn immer nur an dieser Stelle addiert und 
sonst nirgends subtrahiert wird. Ist zwar nicht konform zum Standard, 
weil das Verhalten beim Überlauf hier undefiniert ist, aber praktisch 
passt es.

Je nach Programm könnte allerding der Optimizer sich des Themas kreativ 
annehmen. Denn der darf u.U. davon ausgehen, dass dies nicht passiert.

Aber bei 32 Bits dauert es augehend von 0 verdammt lang bis der Fall 
eintritt. ;-)

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.