![]() |
Multiplikation von Integerwerten gibt Überlauf
Hi
bei folgendem Source spuckt der Compiler folgende Fehlermeldung aus: 'E2099 Überlauf bei Konvertierung oder arithmetischer Operation'
Delphi-Quellcode:
Warum ist da so? :gruebel:
var
nSize : Int64; nPotenz : Integer //nPotenz : Int64; <<< Funktioniert nPotenz := 1024; if nSize > (nPotenz) then AFormat := 'fsKilobyte'; if nSize > (nPotenz * nPotenz) then AFormat := 'fsMegabyte'; if nSize > (nPotenz * nPotenz * nPotenz) then AFormat := 'fsGigabyte'; if nSize > (nPotenz * nPotenz * nPotenz * nPotenz) then <<< Fehler weil > 32Bit AFormat := 'fsTerabyte'; if nSize > (nPotenz * nPotenz * nPotenz * nPotenz * nPotenz) then <<< Fehler weil > 32Bit AFormat := 'fsPetabyte'; Das Geheimnis liegt in der Variablendeklaration von 'nPotenz'. Integer funktioniert nicht, Int64 schon, obwohl ich der Variable 'nPotenz' ja gar nix größers als Integer zuweisen will. Hätte mal gern gewusst, warum kann das Ergebnis einer Multiplikation nicht größer sein als der Bereich der Variable, die für die Multiplikation benutzt wird? Ist das nur beim Delphi Compiler so? |
Re: Multiplikation von Integerwerten gibt Überlauf
Zitat:
Zitat:
|
Re: Multiplikation von Integerwerten gibt Überlauf
Das ist überall so. Schreib zwei Blätter mit jeweils einer Zahl voll, das Ergebnis passt nicht auf eines (in der Regel) ;) Integer geht bis 2^31 - 1, also bis (bei dir) knapp unter 2 Gigabyte.
|
Re: Multiplikation von Integerwerten gibt Überlauf
Zitat:
so ist es ja nicht, aber das Ergebnis kann nicht grösser sein als die Variable, in der das Ergebnis gespeichert werden soll - logisch, man kann ja auch nicht 100 l Wasser in einer Sprudelflasche unterbringen. Das sind Grundlagen der Datenverarbeitung überhaupt: im Computer gibt es keine unendlich grossen Zahlen, daher gibt es bei JEDEM Datentyp Zahlen, die nicht mehr hineinpassen. Gruss Reinhard |
Re: Multiplikation von Integerwerten gibt Überlauf
Hallo,
den "Fehler" kannst du auch umgehen, indem du den Compiler zwingst, Code für eine Berechnung auf Int64-Basis zu erzeugen:
Delphi-Quellcode:
Gruß Hawkeye
var
nPotenz : Integer; begin : if nSize > (Int64(nPotenz) * nPotenz * nPotenz * nPotenz) then AFormat := 'fsTerabyte'; if nSize > (Int64(nPotenz) * nPotenz * nPotenz * nPotenz * nPotenz) then AFormat := 'fsPetabyte'; end; |
Re: Multiplikation von Integerwerten gibt Überlauf
Hallo
der Vergleich mit zwei Blatt Papier oder 100 L Wasser ist ja sehr anschaulich, aber meiner Meinung nach nicht mal richtig. Was die Lösung ist, hab ich ja selbst gepostet. Zitat:
Delphi-Quellcode:
Der Delphi Compiler verwendet also anscheinend für Multiplikationen (intern !!!) einen Integer als Speicheradresse. Liegt warscheinlich daran, dass das aktuelle RAD 2007 noch kein 64Bit Compiler ist.
var
nSize : Int64; nPotenz : Word; nPotenz := 1024; if nSize > (nPotenz) then AFormat := 'fsKilobyte'; if nSize > (nPotenz * nPotenz) then <<< funktioniert obwohl größer als 65535 AFormat := 'fsMegabyte'; if nSize > (nPotenz * nPotenz * nPotenz) then <<< funktioniert obwohl größer als 65535 AFormat := 'fsGigabyte'; if nSize > (nPotenz * nPotenz * nPotenz * nPotenz) then <<< hier knallt es wieder weil, > 32Bit AFormat := 'fsTerabyte'; if nSize > (nPotenz * nPotenz * nPotenz * nPotenz * nPotenz) then AFormat := 'fsPetabyte'; |
Re: Multiplikation von Integerwerten gibt Überlauf
Bei arithmetischen Operationen wird laut Dokumentation immer der größte Datentyp aller beteiligten Operanden verwendet, "kleine" Typen (Byte, Word,...) werden dabei zunächst auf Integer erweitert. Dies erklärt, warum in deinem letzten Beispiel die Operationen fehlerfrei durchgeführt werden können.
Gruß Hawkeye |
Re: Multiplikation von Integerwerten gibt Überlauf
Zitat:
|
Re: Multiplikation von Integerwerten gibt Überlauf
Zitat:
Wünsche einen schönen Abend OREADEN |
Re: Multiplikation von Integerwerten gibt Überlauf
...wobei dann aber wiederum Folgefehler auftreten können bzw. sogar wahrscheinlich auftreten.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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