AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Int64-Überlauf erkennen / Registerabfrage
Thema durchsuchen
Ansicht
Themen-Optionen

Int64-Überlauf erkennen / Registerabfrage

Ein Thema von archimedix · begonnen am 11. Aug 2011 · letzter Beitrag vom 11. Aug 2011
Antwort Antwort
archimedix

Registriert seit: 17. Jul 2011
20 Beiträge
 
Delphi 10.4 Sydney
 
#1

Int64-Überlauf erkennen / Registerabfrage

  Alt 11. Aug 2011, 10:42
Hallo,

gibt es eine Möglichkeit zu erkennen, ob bei einer Rechenoperation mit Int64-Typen ein Überlauf aufgetreten ist?

Und zwar das ganze nicht über den Overflowcheck des Compilers, sondern z.B. über eine Auswertung der Prozessorregister.

Ich kenne mich mit asm leider nicht aus und weiß daher nicht, was die CPU in irgendwelchen Flag-Registern im Falle eines Überlaufs hinterlässt und wie man das abfragen kann. Wer kann mir hier weiterhelfen?
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#2

AW: Int64-Überlauf erkennen / Registerabfrage

  Alt 11. Aug 2011, 11:27
Knifflig. Wenn Du überhaupt eine Chance haben will, mußt Du wahrscheinlich Deine ganzen Rechnungen in elementare Schritte aufteilen und nach jeden Schritt prüfen. Beispiel:
Delphi-Quellcode:
var
  x,y: int64;
begin
  x := $7fffffffabcd1234;
  y := x + $7890abcd; // Overflow erkennbar
  y := ((x+ $7890abcd) - $7890abcd) + 1; //**
end;
In ** ist nach der Zuweisung kein Overflow erkennbar, effektiv ist das ja y := x +1. Aber es sind ja eigentlich zwei Overflows aufgetreten.
  Mit Zitat antworten Zitat
archimedix

Registriert seit: 17. Jul 2011
20 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Int64-Überlauf erkennen / Registerabfrage

  Alt 11. Aug 2011, 11:40
Aufteilung in elementare Schritte und Prüfung nach jedem Schritt wäre kein Problem, ist genau das, was ich machen möchte!

(wollte man erst am Ende einer längeren Rechung festellen, ob irgendwo ein Überlauf aufgetreten ist, wäre wahrscheinlich die try-Except-Variante bei eingeschalteter Überlaufprüfung durch den Compiler das praktischste...)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Int64-Überlauf erkennen / Registerabfrage

  Alt 11. Aug 2011, 11:59
über Register wäre so:

Delphi-Quellcode:
function getFlags:Integer;
asm
  pushfd
  pop eax
end;



procedure TForm1.Button1Click(Sender: TObject);
var x:int64;
begin
  x:=$7FFFFFFFFFFFFFFF;
  x:=x+1;
  if (getFlags and ($800))<>0 then //$800 : Testen der Flags ob OL gesetzt ist
    showmessage('Überlauf: '+inttostr(x));
end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
archimedix

Registriert seit: 17. Jul 2011
20 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Int64-Überlauf erkennen / Registerabfrage

  Alt 11. Aug 2011, 12:02
Danke, das sieht schon ganz gut aus.

Kann man das auch als inline-Funktion mit boolschem Rückgabewert realisieren?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Int64-Überlauf erkennen / Registerabfrage

  Alt 11. Aug 2011, 12:06
Delphi-Quellcode:
function isOLFlag:boolean;
asm
  pushfd
  pop eax
  and eax,$800
  shr eax,11
end;
inline hat mein D7 nicht, musst du mal testen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#7

AW: Int64-Überlauf erkennen / Registerabfrage

  Alt 11. Aug 2011, 12:07
Delphi-Quellcode:
function IsOverFlow(): Boolean;
begin
  Result := (getFlags and ($800))<>0;
end;
So sollte es klappen, wen man GetFlags hier wiederverwendet.

EDIT: mist sirius war schneller^^

MFG
Memnarch
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
archimedix

Registriert seit: 17. Jul 2011
20 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Int64-Überlauf erkennen / Registerabfrage

  Alt 11. Aug 2011, 12:12
Hallo !

Danke, Problem gelöst!!
  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 15:17 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