Kleines Rätsel : Overflow läßt sich nicht mit <> erkennen

Gast #1138172
Hallo Zusammen,

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

5
Overflow += 3;
6
if(Overflow > 0) {
7
  plus = 1;
8
  minus = 0;
9
} else {
10
  plus = 0;
11
  minus = 1;
12
}

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
Wenn ich mich recht erinnere liegt das an der Größe der Konstanten.

Versuch mal das hier:
1
long Overflow;
2
char plus;
3
char minus;
4

5
Overflow += 3;
6
if(Overflow > ((long) 0)) {
7
  plus = 1;
8
  minus = 0;
9
} else {
10
  plus = 0;
11
  minus = 1;
12
}
Gast
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(?)
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
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
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

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