Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Überlauf einer 4bit-Zahl (https://www.delphipraxis.net/79035-ueberlauf-einer-4bit-zahl.html)

hanselmansel 15. Okt 2006 11:15


Überlauf einer 4bit-Zahl
 
Hallo,

ich wollte mir gerade einen Zahltyp definieren, der nur die Werte 0 bis 7 annehmen kann.
Delphi-Quellcode:
Type
  TVierBitZahl = 0..7;
Wenn ich nun aber einer Variable dieses Typs den Wert 7 zuweise, und 1 addiere zeigt mir
Delphi-Quellcode:
var
  eineZahl :TVierBitZahl;

procedure TForm1.Button2Click(Sender: TObject);
begin
eineZahl := eineZahl + 1;
ShowMessage(IntToStr(eineZahl));
end;
die Meldung den Wert 8 an. Wenn ich das Ganze Probiere und dabei TVierBitZahl durch Byte ersetze, dann zwigt er mit 254... 255... 0 an.

Meine Fragen sind nun:
  • Woran liegt das?
  • Wie bekomme ich es hin, dass auch meine 4bit-Zahl so praktisch überläuft?

Wenn die Sache nicht funktioniert, muss ich wohl oder über immer mit Modulo arbeiten... :?

MfG,

hanselmansel

marabu 15. Okt 2006 11:50

Re: Überlauf einer 4bit-Zahl
 
Hallo,

Zitat:

Zitat von hanselmansel
Woran liegt das?

du hast die Bereichsüberprüfung {$R} abgeschaltet.

Zitat:

Zitat von hanselmansel
Wie bekomme ich es hin, dass auch meine 4bit-Zahl so praktisch überläuft?

garnicht.

Zitat:

Zitat von hanselmansel
Wenn die Sache nicht funktioniert, muss ich wohl oder über immer mit Modulo arbeiten...

darauf wird es hinauslaufen.

Das von dir geschätzte Überlaufverhalten resultiert aus der direkten Abbildung eines internen Datentyps auf einen vom Prozessor unterstützten Datentyp (nativer Datentyp). Sobald du einen Subtyp definierst, musst du mit dem modulo-Operator arbeiten um den gleichen Effekt zu erzielen. Bedenke dabei, dass der Effekt auch bei nativen Datentypen nur bei abgeschalteter Bereichsüberprüfung möglich ist.

Grüße vom marabu

JasonDX 15. Okt 2006 11:51

Re: Überlauf einer 4bit-Zahl
 
Zitat:

Zitat von hanselmansel
Wenn ich das Ganze Probiere und dabei TVierBitZahl durch Byte ersetze, dann zwigt er mit 254... 255... 0 an.

Meine Fragen sind nun:
  • Woran liegt das?

Ein Byte kann nicht mehr aufnehmen, als 8Bit. Dort ist es bereits bedingt, da auch die CPU nur mit 8Bit-Werten arbeitet und damit auch den Ueberlauf beachtet und entsprechende Flags setzt ect. (ansonsten wuerde eine Operation auf AL bspw. AH veraendern, was nicht sein darf.)

Zitat:

Zitat von hanselmansel
  • Wie bekomme ich es hin, dass auch meine 4bit-Zahl so praktisch überläuft?
Wenn die Sache nicht funktioniert, muss ich wohl oder über immer mit Modulo arbeiten... :?

Die CPU kann nicht mit (!)3-Bit-Zahlen arbeiten (0..7 braucht nur 3 bit), d.h. es muesste der Compiler selbst gucken, ob mir die Operation soeben einen Ueberlauf beschert hat. Anscheinend macht er das nicht, warum, kA.
Einen Ueberlauf kann man (in deinem Fall) auch ohne Modulo verhindern/bzw. erkennen:
Delphi-Quellcode:
(zahl and $F8 > 0) //Boolscher Ausdruck, der einen Ueberlauf erkennt
zahl := zahl and $07;//Um einen Ueberlauf zu verhindern
Zumindest sollte es in der Theorie so funktionieren, ich habs nich ausprobiert.

greetz
Mike

hanselmansel 15. Okt 2006 11:54

Re: Überlauf einer 4bit-Zahl
 
Dankeschön. :dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz