Überlauf beim Multiplizieren von Ganzzahlen und Zuweisen von Long

8

Wenn ich folgendes in das unmittelbare Fenster tippe, bekomme ich Laufzeitfehler '6': Überlauf.

%Vor%

Warum ist das?

Dies schlägt auch fehl:

%Vor%

Warum ist das? giveTime wird als Long-Typ deklariert, daher sollte 24 × 60 × 60 = 86400 bequem passen.

    
Excel_Cowboy_Yeeha 26.06.2013, 08:56
quelle

2 Antworten

23

Das ist eine wirklich merkwürdige VBA-Eigenart. Ich bin erstaunt, dass ich noch nie darauf gestoßen bin.

%Vor%

Es sieht also so aus, als ob die Operatoren * und + in den ersten beiden Beispielen eine Ganzzahl zurückgeben. Sicher genug, in der Hilfedatei für den Operator * (ähnlich für den Operator + ):

  

Ergebnis = Nummer1 * Nummer2

     

[...]

     

Der Datentyp von result ist normalerweise identisch mit dem des genauesten Ausdrucks.

Ihre Literale 24, 60 und 60 sind standardmäßig vom Typ Integer, daher gibt der Operator * (oder + ) eine Ganzzahl zurück, die überläuft, weil das Ergebnis größer als 32.767 ist.

Jedoch verwendet das Literal 32.768 im dritten Beispiel oben den Typ Long (da es zu groß ist, um eine Ganzzahl zu sein) und so gibt + eine Long zurück; kein Überlauf.

Die Hilfedatei sagt das auch:

  

Wenn der Datentyp von result eine Integer Variante ist, die den zulässigen Bereich überschreitet [...] Dann result wird [...] in eine Long-Variante umgewandelt.

Schwerpunkt meiner. Jetzt klingt diese kleine Regel wie gesunder Menschenverstand, und jeder würde vernünftigerweise annehmen, dass es in Ihrem Fall gilt. Aber Ihre Zahlen sind vom Typ Integer, nicht Variant / Integer, also wendet VBA diese Regel nicht an! Macht absolut keinen Sinn für mich, aber so ist es, und das ist es, was die Dokumentation sagt.

Lösung: Machen Sie eines der Argumente Ihres * -Operators präziser als Integer (z. B. Long) und das Problem verschwindet.

%Vor%

Tatsächlich, und das ist wahrscheinlich der Grund, warum ich nie auf diese Eigenart gestoßen bin, mache ich es mir zur Gewohnheit, alle meine Integer-Variablen stattdessen als Long zu deklarieren, es sei denn, es gibt eine spezielle Sorge, dass Longs anstelle von Integers Probleme verursachen mit Speicherverbrauch oder Ausführungszeit (was fast nie der Fall ist). Zugegeben, dies hilft nicht, wenn Sie mit Literalen arbeiten, die kleiner als 32.768 sind, weil sie standardmäßig auf den Integer-Typ eingestellt sind.

Sie fragen in einen Kommentar , was eine Variante / Integer ist. Variante ist grundsätzlich ein Containertyp für jeden anderen Datentyp. In dem speziellen Fall, in dem Sie eine Ganzzahl enthalten:

%Vor%

Aber wie oben erwähnt, löst eine einfache alte Ganzzahl den Überlauffehler aus:

%Vor%     
Jean-François Corbett 26.06.2013, 09:22
quelle
1

Platzieren Sie nach jeder Nummer #. Es definiert jede Nummer als ein Doppel. Stellen Sie sich vor, dass jede Zahl für die Berechnung als eine Art temporäre Variable im Speicher abgelegt wird. Wenn Sie jede Zahl definieren, wird genügend Speicherplatz für die Berechnungen zur Verfügung stehen.

zB:

Dim x als lang

x = 24 # * 60 # * 60 #

oder 24 & amp; 'zeigt lange an

    
tango_golfaus 12.09.2016 21:59
quelle

Tags und Links