AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Überlauf einer 4bit-Zahl

Ein Thema von hanselmansel · begonnen am 15. Okt 2006 · letzter Beitrag vom 15. Okt 2006
Antwort Antwort
Benutzerbild von hanselmansel
hanselmansel

Registriert seit: 23. Feb 2005
Ort: Kaiserslautern
279 Beiträge
 
Delphi 2009 Enterprise
 
#1

Überlauf einer 4bit-Zahl

  Alt 15. Okt 2006, 11:15
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
Es gibt nur sehr wenige Probleme auf dieser Welt, die sich nicht mit einigen hundert Gramm Sprengstoff lösen ließen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Überlauf einer 4bit-Zahl

  Alt 15. Okt 2006, 11:50
Hallo,

Zitat von hanselmansel:
Woran liegt das?
du hast die Bereichsüberprüfung {$R} abgeschaltet.

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

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
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#3

Re: Überlauf einer 4bit-Zahl

  Alt 15. Okt 2006, 11:51
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 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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von hanselmansel
hanselmansel

Registriert seit: 23. Feb 2005
Ort: Kaiserslautern
279 Beiträge
 
Delphi 2009 Enterprise
 
#4

Re: Überlauf einer 4bit-Zahl

  Alt 15. Okt 2006, 11:54
Dankeschön.
Es gibt nur sehr wenige Probleme auf dieser Welt, die sich nicht mit einigen hundert Gramm Sprengstoff lösen ließen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 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