Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Integerüberlauf bei Cardinalmultiplikation? (https://www.delphipraxis.net/53967-integerueberlauf-bei-cardinalmultiplikation.html)

Kedariodakon 26. Sep 2005 16:32

Re: Integerüberlauf bei Cardinalmultiplikation?
 
hmm es kommt nur wenn: Compielerschalter Project/Optionen/Compiler/Überlaufprüfung An ist, dies ist aber in allen meinen Projecten so...

Vielleicht könntet ihr ja mal schauen ob der bei euch gesetzt ist oder nicht.

Bye


Edit: BTW die demos gehen...

Hador 26. Sep 2005 16:36

Re: Integerüberlauf bei Cardinalmultiplikation?
 
Dann kommte bei mir auch 'n Integeroverflow Error

Sharky 26. Sep 2005 16:45

Re: Integerüberlauf bei Cardinalmultiplikation?
 
Zitat:

Zitat von Hador
Dann kommte bei mir auch 'n Integeroverflow Error

Bei D7 kommt tatsächlich der Fehler. Bei D2k5 nicht.

EDIT Ich habe eben mal das UpDate für Delphi 7 installiert. Jetzt kann ich den Fehler nicht mehr reproduzieren.

Flocke 26. Sep 2005 16:55

Re: Integerüberlauf bei Cardinalmultiplikation?
 
Bei mir klappts mit D2005, sowohl mit als auch ohne Überlaufprüfung.

Hab' gerade mal ein bisschen Disassembliert und dabei gesehen, dass Delphi je nach Einstellung eine der Instruktionen imul (ohne Überlaufprüfung) oder mul (mit Überlaufprüfung) erzeugt.

Code:
  ; Mit Prüfung            ; Ohne Prüfung
  mov ecx,$3b9aca00         mov eax,$3b9aca00       
  mov ebx,$00000004         mov edx,$00000004
  mov eax,ebx              imul edx
  mul ecx
  jnb @cont
  call @IntOver
@cont:
Vielleicht kann das einer mit 'ner anderen Delphi-Version mal nachvollziehen?

Also: Breakpoint auf die Multiplikation und wenn Delphi hält dann Ansicht -> Debug Fenster -> CPU.

Vielleicht erzeugen andere Delphi-Versionen bei Optimierung und Überlaufprüfung die falsche CPU-Instruktion - imul setzt nämlich das Carry-Flag, das bei "jnb @cont" überprüft wird, mul hingegen nicht.

Christian Seehase 26. Sep 2005 17:57

Re: Integerüberlauf bei Cardinalmultiplikation?
 
Moin Volker,

unter D7Pro SP1 => exakt die gleichen Routinen wie bei Dir.

himitsu 26. Sep 2005 18:10

Re: Integerüberlauf bei Cardinalmultiplikation?
 
Dat is'n Problem des DelphiCompilers ... es wird oftmals nicht wirklich darauf geachtet, ob signed, oder unsigned Integerroutinen verwendet werden.

die Überlaufkontrollen sind fast überall nur als signed Integer-Routinen engebunden, wodurch dann natürlch auf die Charakeristik des Integers geprüft wird.

Am Meißten gibt's da ja bei den 64-Bit-Struckturen massive Probleme.


Und in diesem Fall würde es nichtmal was bringen, wenn du direkt einen bestimmten Typ angibst:
Delphi-Quellcode:
Function  CmC:  LongWord;
Var  c1:  LongWord;
      c2:  LongWord;
Begin
   c1         := 1000000000;
   c2         := 4;
   Result  := c1 * c2 
End;



Also entweder läßt du dir Überlaufprüfung komplett weg, oder du schaltest sie halt in diesem speziellen Fall ab - ich glaub mit {$O-} und dnach dann natürlich wieder an.
Notfalls und wenn erwünscht mußt di dann halt selber die Überlaufprüfung Programmieren.

Einen anderen Weg gibt's wohl nicht ... du kannst dir natürlich auch 'ne Delphi-Version suchen, wo es richtig implementiert ist.

Christian Seehase 26. Sep 2005 18:30

Re: Integerüberlauf bei Cardinalmultiplikation?
 
Moin Zusammen,

so, ich hab' das jetzt noch einmal probiert mit D7Pro ohne SP1:

Delphi-Quellcode:
;Mit Prüfung
mov eax,$3b9aca00
mov edx,$00000004
imul edx
jnb +$05
call @IntOver
ret
Der Fehler eine vorzeichenbehaftete Multiplikation bei vorzeichenlosen Operanden durchzuführen, wurde bei SP1 also behoben.

NicoDE 26. Sep 2005 19:03

Re: Integerüberlauf bei Cardinalmultiplikation?
 
Workaround (der allerdings etwas Performance kostet)
Delphi-Quellcode:
function CmC: Cardinal;
var
  c1: Cardinal;
  c2: Cardinal;
begin
  c1 := 1000000000;
  c2 := 4;
  Result := Int64(c1) * Int64(c2);
end;

alzaimar 26. Sep 2005 19:37

Re: Integerüberlauf bei Cardinalmultiplikation?
 
D6SP2 => imul

Kedariodakon 26. Sep 2005 20:39

Re: Integerüberlauf bei Cardinalmultiplikation?
 
Ich habe das ATM auch mit int64 gelöst @Nico, wollte aber nun mal wissen an was das so liegt...

Bye


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:06 Uhr.
Seite 2 von 3     12 3      

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