Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Integerüberlauf bei LongWord (https://www.delphipraxis.net/189394-integerueberlauf-bei-longword.html)

ing 8. Jun 2016 06:25

Integerüberlauf bei LongWord
 
Hallo,
Bei folgender Zuweisung bekomme ich einen Runtime Error (Integerüberlauf):

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var w:LongWord;
    i:Integer;
begin
  w:=3;
  i:=-w; // <-- Integerüberlauf
  ShowMessage(IntToStr(w)+' / '+IntToStr(i));
end;
Ich bin mir sicher, dass dieser Code bisher funktioniert hat.
Hat jemand eine Idee wo hier der Fehler liegt?

Danke,
ing

Lemmy 8. Jun 2016 06:35

AW: Integerüberlauf bei LongWord
 
naja.. da Longword einen gültigen Wertebereich von 0..4294967295 hat ist es eigentlich logisch, dass es bei negativer Zuweisung einen Überlauf gibt.

P.S.: Herzlich willkommen in der DP! :-)

Der schöne Günther 8. Jun 2016 06:53

AW: Integerüberlauf bei LongWord
 
Hallo :party:

Er steckt in die LongWord-Variable aber keine negativen Werte rein. Bei Dingen wie
Delphi-Quellcode:
w:= -w;
wäre das so, aber nicht hier.

Und ich bekomme hier ehrlich gesagt auch keinen Überlauf. Welche Delphi-Version, welche Plattform? (Windows/Mac/... bzw. 32/64 Bit?)

ing 8. Jun 2016 06:58

AW: Integerüberlauf bei LongWord
 
Hallo Lemmy,

Zitat:

Zitat von Lemmy (Beitrag 1339712)
da Longword einen gültigen Wertebereich von 0..4294967295 hat ist es eigentlich logisch, dass es bei negativer Zuweisung einen Überlauf gibt.

Das leuchtet mir nicht recht ein:
w ist 3
i ist ein Integerwert
i:=-w; sollte also -3 ergeben. wo soll da ein Überlauf stattfinden?
i:=-3; funktioniert ja ohne Probleme.

Außerdem bin ich mir sicher, dass diese Zuweisung schon länger in meinem Programm drin steht und es bisher noch keine Probleme damit gab. ??

ing

ing 8. Jun 2016 07:01

AW: Integerüberlauf bei LongWord
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1339713)
Welche Delphi-Version, welche Plattform?

Ich verwende Delphi 5 Professional (UpdatePack 1) und habe vor kurzem auf Windows 10 Pro (64 Bit) umgestellt.

TRomano 8. Jun 2016 07:05

AW: Integerüberlauf bei LongWord
 
Hallo und Willkommen in der DP !

So weit hast Du ja auch Recht, aber ... nach mehrmaligen Hinsehen habe ich aber auch erst das Minuszeichen gesehen !

i:= - w;

Das macht nichts weiter als eine Multiplikation mit -1 und schon bist Du aus dem gewähltenm Wertebereich raus und bekommst einen Überlauffehler.

Habe gerade mal ein altes Delphi 7 angeworfen und da steht: Longword = Cardinal (unsigned)

Gruß Thomas

Sir Rufo 8. Jun 2016 07:24

AW: Integerüberlauf bei LongWord
 
Ein Cast mit
Delphi-Quellcode:
i := - Integer( w );
sollte funktionieren.

Jasocul 8. Jun 2016 07:30

AW: Integerüberlauf bei LongWord
 
@Sir Rufo:
Erklärt aber nicht die Ursache. Du bist doch sonst so gründlich ;) Dein Cast würde übrigens trotzdem den Fehler nicht beheben, wenn w einen Inhalt hat (woher auch immer), der zu einem Integer-Überlauf führt.

@Ing:
Hast du denn mal den Debugger bemüht und nachgesehen, was vor der Zuweisung in den Variablen steht? Hast du vielleicht eine der Variablen nochmal woanders (global oder in TForm1) definiert?

Lemmy 8. Jun 2016 07:42

AW: Integerüberlauf bei LongWord
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1339713)
Er steckt in die LongWord-Variable aber keine negativen Werte rein. Bei Dingen wie
Delphi-Quellcode:
w:= -w;
wäre das so, aber nicht hier.

das stimmt, aber er multipliziert einen Longword mit -1 und was ist das Ergebnis? ein Longword.

Zitat:

Zitat von Der schöne Günther (Beitrag 1339713)
Und ich bekomme hier ehrlich gesagt auch keinen Überlauf. Welche Delphi-Version, welche Plattform? (Windows/Mac/... bzw. 32/64 Bit?)

schalte mal in den Compileroptionen die Überlaufprüfung ein.

Lemmy 8. Jun 2016 07:51

AW: Integerüberlauf bei LongWord
 
Zitat:

Zitat von Sir Rufo (Beitrag 1339720)
Ein Cast mit
Delphi-Quellcode:
i := - Integer( w );
sollte funktionieren.

wenn man funktionieren mit "da kommt jetzt keine Exception mehr" übersetzt dann ja:

Delphi-Quellcode:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var w:LongWord;
    i:Integer;
begin
  w:= High(LongWord);
  i:=-Integer(w);
  ShowMessage(IntToStr(w)+' / '+IntToStr(i));
end;
Das dürfte aber nur in bestimmten Fällen kein Problem sein :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 Uhr.
Seite 1 von 2  1 2      

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