[VBA] int + int = ?

value

Commander
Registriert
Dez. 2003
Beiträge
2.120
Öhm, eigentlich eine einfache Sache, aber trotzdem für mich recht eigenartig.

Ich habe 2 Zahlen, 20.000 und 25.000 - jeweils als integer. Dies beiden Zahlen addiere ich, und da ich damit über den Wertebereich eines Integers hinausgehe, ist die Variable, welche die Summe der Addition, also 45.000 übernimmt ein long.
Das müsste doch mehr als ausreichen.

Allerdings meckert er von wegen Überlauf etc.

Kann ich keinen int+int=long machen ?
 
tux73 schrieb:
mach vorher die einzelnen Werte als long und addiere die dann. keine ahnung ob das geht, aber das schießt mir als erstes ein.

Gehen tut das schon, nur ist es halt einfach Verschwendung :)

Kein Rechner heutzutage kümmert sich irgendwie um den Unterschied, aber ich will auch wissen warum ich nicht 2 int addieren kann, und das in einem long ausgeben kann.
Wenn das wirklich nicht ginge, wär die Sprache doch zur Speicherverschwendung verdammt.
 
kenn mich in VBA nun gar nicht aus, aber müsste ungefähr so aussehen:

newlongvar = (long) (int1 + int2) :p
 
das is überall so. manche sprachen machen sowas vieleicht automatisch aber man kann nur 2 werte des gleichen typs miteinander "verrechnen". ich nehme mal an das geht bei computern net anders, da der ja schon etwas anders rechnet als wir.

in vielejn sprachen kann man dafür aber temporär ein long anlegen. in c müsste das so eigentlich gehen: long blaa = (long)einInt + (long)nochEinInt;

Dabei wird auch net weiter speicher verschwendet als sein muss.
 
Das is völlig normal, so wie Husky schon sagte. Es müssen halt beide Zahlen erst ins Zielformat gecastet werden, da ansonsten 2 int´s eben addiert werden, und dadurch ein Überlauf stattfindet.
Code:
newlong=(long)int1 + (long)int2;
Kannst ja auch mal sowas versuchen:
Code:
newfloat=oldint * oldfloat;
Da kommt auch Mist bei Raus. Du musst dem Prozessor, bzw. Compiler sagen, dass du in dem Fall mit Floats, bzw. longs rechnen willst, denn diese Rechnungen finden in anderen Teilen der CPU statt.
 
Husky hat Recht. bei Access muß ich auch immer Umwege gehen, wenn ich zwei verschiedene Datentypen hab. Aber andererseits kann ich auch zwei Daten subtrahieren (10.10.2004 - 8.10.2004 = 2) und bekomme kein Datum raus sondern eine Zahl. Meinst Du sowas?

*edit*
Also eine automatische Umsetzung in ein anderes Format?
 
Zuletzt bearbeitet:
Ach ja, um es noch verständlicher zu beschreiben, ein Prozessor kann immer nur 2 Zahlen mit gleichen Formaten miteinander verrechnen, als Ergebnis kommt eine Zahl im gleichen Format heraus. Daher muss vor der Berechnung gecastet werden.

Mag sein dass es compiler oder Programmiersprachen gibt, die sowas verschleiern, ist aber meines erachtens nicht gerade gut, weil man ja manchmal solche "schrägen" Berechnungen tatsächlich machen will.
 
Danke erstmal. Es ging ja gar nicht so um das Problem selbst, nehm ich halt long's anstatt int's, aber ich dachte schon das es elegantere Möglichkeiten gibt sich darüber hinwegzusetzen.
 
hast du es den schonmal mit den hier geposteten lösungen versucht? ich hab von vba keine ahnung, aber in der regel kann man die werte irgendwie zurecht-casten. Damit verbrauchst du auchnet mehr Speicher da du ja keine neue variable anlegst, das braucht dann nur mehr platz in den CPU registern wenn du da temporär ein long draus machst(zumindest soweit ich das bissher verstanden hab *g*).
 
Siberian..Husky schrieb:
...das braucht dann nur mehr platz in den CPU registern wenn du da temporär ein long draus machst...

Noch nicht mal das, weil die Register alle gleich lang sind, und auch mit einem 16Bit Short als voll belegt gelten. :)
 
Naja, Speicherverschwendung? :-) Ich denke mal ganz stark, dass auch VBA seine Daten an 32- oder 64-Bit - Grenzen ausrichtet. Damit verbraucht auch ein 16-Bit int im Speicher seine 32 oder 64 Bit. Solche geringen Speichermengen brauchst Du nicht weiter zu beachten, da gibt es ganz anderes Optimierungspotenzial.

Btw, auf einer 32-Bit Maschine ist das Rechnen mit "echten" 16-Werten übrigens langsamer als mit 32-Bit-Werten.
 
Nein, im realen Arbeitsspeicher wird trotzdem bis zur 32 Bitgrenze gesperrt. Davon bekommt der Anwender aber nix mit.
 
value schrieb:
Danke erstmal. Es ging ja gar nicht so um das Problem selbst, nehm ich halt long's anstatt int's, aber ich dachte schon das es elegantere Möglichkeiten gibt sich darüber hinwegzusetzen.

Da schlägt bei dir etwas zu, was mich auch letzte Woche verwundert hat, MS hat nämlich integer nicht als 32-Bit-Zahl sondern als 16-Bit-Zahl in VBA implementiert, dazu steht in der Office-Hilfe folgendes:
Integer-Datentyp:
Variablen vom Datentyp Integer werden als 16-Bit-Zahlen (2 Bytes) in einem Bereich von -32.768 bis 32.767 gespeichert...

Folglich muss der Parser sich beschweren, da deine Rechnung 20.000 + 25.000 die Grenzen sprengt. Typcasting musst du nicht durchführen aber die Zielvariable muss vom Type Long sein.
 
Siberian..Husky schrieb:
im speicher belegt ein 16bit wert aber aufjedenfall nur 16 bit, und keine 32. sonst wäre die unterteilung ja voll fürn arsch ;)
Nö, das ist so nicht richtig. Die Unterteilung ist erstmal hauptsächlich für die Semantik. Da ein 32-Bit Prozessor auf Daten, die an 32-Bit-Adressen liegen (also durch 4 teilbar sind) besonders schnell zugreifen kann, werden auch kleine Daten fast immer an 32-Bit Grenzen ausgerichtet und mit sog. Paddingbytes aufgefüllt. Der zusätzliche Speicherverbrauch ist auf jeden Fall zu tolerieren. Denn was kümmert es heutzutage, ob deine Variablen jetzt 100KB oder 200KB verbraten? Wenn Du irgendwann an die 100MB Grenze kommst im Speicherverbrauch kannst Du dir nochmal Gedanken darüber machen. Eine entsprechende Anwendung, die auch soviel Speicher braucht, will aber erstmal geschrieben sein.
 
kenne mich auch weniger mit VBA aus...

.. aber da sollte es doch auch unsigned int oder sowas geben, oder? Durch das Einsparen des Vorzeichens verdoppelt sich der positive Wertebereich. In C++ sind für unsigned Int Werte von 0 bis 65535 definiert.

Aber wenn Du mit noch grösseren Werten oder auch Negativwerten arbeitest, solltest Du definitiv auf long wechseln.

Grüße
DanGermany
 
Ähm, ich bastel grad eine Anwendung (C++), wo ein char ausreichen würde, gibts nen Trick dass der die Daten ohne Paddingbytes in den Speicher ablegt?
Von den chars habe ich gleich abermillionen, daher würde sich das evtl. rechnen.
 
7H3 N4C3R schrieb:
Nö, das ist so nicht richtig. Die Unterteilung ist erstmal hauptsächlich für die Semantik. Da ein 32-Bit Prozessor auf Daten, die an 32-Bit-Adressen liegen (also durch 4 teilbar sind) besonders schnell zugreifen kann, werden auch kleine Daten fast immer an 32-Bit Grenzen ausgerichtet und mit sog. Paddingbytes aufgefüllt. Der zusätzliche Speicherverbrauch ist auf jeden Fall zu tolerieren. Denn was kümmert es heutzutage, ob deine Variablen jetzt 100KB oder 200KB verbraten? Wenn Du irgendwann an die 100MB Grenze kommst im Speicherverbrauch kannst Du dir nochmal Gedanken darüber machen. Eine entsprechende Anwendung, die auch soviel Speicher braucht, will aber erstmal geschrieben sein.

das is aber echt beschissen. anwendungen die soviel speicher brauchen lassen sich schnell schreiben. ich hab auch schon ein php script geschrieben das je nach datenbankgröße bis über 100mb speicher braucht ;) (habs dann aber nochmal neu implementiert, man muss sich ja net alles de ganze zeit merken *g*. auch wenn die erste version vom klassen design viel schöner war...).
 

Ähnliche Themen

Antworten
5
Aufrufe
2.058
Zurück
Oben