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


von Bernd Emmerich (Gast)


Lesenswert?

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

von Andreas K. (ergoproxy)


Lesenswert?

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
}

von gast (Gast)


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(?)

von Peter D. (peda)


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

von Andreas K. (ergoproxy)


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

von (prx) A. K. (prx)


Lesenswert?

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

von (prx) A. K. (prx)


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.

von (prx) A. K. (prx)


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

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.