AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Multiplikation von Integerwerten gibt Überlauf
Thema durchsuchen
Ansicht
Themen-Optionen

Multiplikation von Integerwerten gibt Überlauf

Ein Thema von Xplosion · begonnen am 30. Dez 2008 · letzter Beitrag vom 30. Dez 2008
Antwort Antwort
Seite 1 von 2  1 2      
Xplosion

Registriert seit: 19. Aug 2005
6 Beiträge
 
#1

Multiplikation von Integerwerten gibt Überlauf

  Alt 30. Dez 2008, 16:40
Hi

bei folgendem Source spuckt der Compiler folgende Fehlermeldung aus:
'E2099 Überlauf bei Konvertierung oder arithmetischer Operation'

Delphi-Quellcode:
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';
Warum ist da so?

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?
  Mit Zitat antworten Zitat
Torpedo

Registriert seit: 21. Dez 2003
410 Beiträge
 
#2

Re: Multiplikation von Integerwerten gibt Überlauf

  Alt 30. Dez 2008, 16:46
Zitat von Xplosion:
warum kann das Ergebnis einer Multiplikation nicht größer sein als der Bereich der Variable, die für die Multiplikation benutzt wird?
Na irgendwo muss das Ergebnis ja zwischengespeichert werden Und da wird der selbe Variablentyp benutzt.
Zitat von Xplosion:
Ist das nur beim Delphi Compiler so?
Nein
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#3

Re: Multiplikation von Integerwerten gibt Überlauf

  Alt 30. Dez 2008, 16:46
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.
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#4

Re: Multiplikation von Integerwerten gibt Überlauf

  Alt 30. Dez 2008, 16:50
Zitat von Xplosion:
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?
Hallo,

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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Multiplikation von Integerwerten gibt Überlauf

  Alt 30. Dez 2008, 18:07
Hallo,

den "Fehler" kannst du auch umgehen, indem du den Compiler zwingst, Code für eine Berechnung auf Int64-Basis zu erzeugen:

Delphi-Quellcode:
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;
Gruß Hawkeye
  Mit Zitat antworten Zitat
Xplosion

Registriert seit: 19. Aug 2005
6 Beiträge
 
#6

Re: Multiplikation von Integerwerten gibt Überlauf

  Alt 30. Dez 2008, 18:47
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:
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.
Ja in welcher Variable wird das Ergebniss gespeichert? In der Integer Variable 'nPotenz'? Kann nicht sein, denn wenn ich 'nPotenz : Integer' als 'nPotenz : Word' deklariere, müsste nach eurer Meinung bei 65535 Schluss sein, bzw. ein Überlauffehler kommen. Ist aber nicht so.

Delphi-Quellcode:
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';
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.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Multiplikation von Integerwerten gibt Überlauf

  Alt 30. Dez 2008, 18:53
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Multiplikation von Integerwerten gibt Überlauf

  Alt 30. Dez 2008, 19:55
Zitat von Xplosion:
der Vergleich mit zwei Blatt Papier oder 100 L Wasser ist ja sehr anschaulich, aber meiner Meinung nach nicht mal richtig...
Ja in welcher Variable wird das Ergebniss gespeichert?
Bisserl nassforsch, wie? Vergleiche hinken, das liegt in der Natur der Sache. Man könnte auch bemängeln, das 100 L Wasser gar nichts mit Integer-Zahlen zu tun hat...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Oreaden

Registriert seit: 10. Nov 2008
60 Beiträge
 
#9

Re: Multiplikation von Integerwerten gibt Überlauf

  Alt 30. Dez 2008, 20:05
Zitat von Xplosion:
wenn ich 'nPotenz : Integer' als 'nPotenz : Word' deklariere, müsste nach eurer Meinung bei 65535 Schluss sein, bzw. ein Überlauffehler kommen.
Dieser kommt auch auf einen 16Bit oder 8Bit System. Aktuell dürftest Du eine 32Bit Architektur haben, und da passen halt 16Bit hinein. Das ist der Grund, ansonsten kannst Du gerne die Überlaufprüfung ausschalten, dann meckert niemand mehr.

Wünsche einen schönen Abend
OREADEN
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Multiplikation von Integerwerten gibt Überlauf

  Alt 30. Dez 2008, 20:09
...wobei dann aber wiederum Folgefehler auftreten können bzw. sogar wahrscheinlich auftreten.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:59 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