![]() |
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... |
Re: Integerüberlauf bei Cardinalmultiplikation?
Dann kommte bei mir auch 'n Integeroverflow Error
|
Re: Integerüberlauf bei Cardinalmultiplikation?
Zitat:
EDIT Ich habe eben mal das UpDate für Delphi 7 installiert. Jetzt kann ich den Fehler nicht mehr reproduzieren. |
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:
Vielleicht kann das einer mit 'ner anderen Delphi-Version mal nachvollziehen?
; 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: 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. |
Re: Integerüberlauf bei Cardinalmultiplikation?
Moin Volker,
unter D7Pro SP1 => exakt die gleichen Routinen wie bei Dir. |
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. |
Re: Integerüberlauf bei Cardinalmultiplikation?
Moin Zusammen,
so, ich hab' das jetzt noch einmal probiert mit D7Pro ohne SP1:
Delphi-Quellcode:
Der Fehler eine vorzeichenbehaftete Multiplikation bei vorzeichenlosen Operanden durchzuführen, wurde bei SP1 also behoben.
;Mit Prüfung
mov eax,$3b9aca00 mov edx,$00000004 imul edx jnb +$05 call @IntOver ret |
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; |
Re: Integerüberlauf bei Cardinalmultiplikation?
D6SP2 => imul
|
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 14:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz