_int64 und dennoch overvlow
-
Hallo!
Ich habe ein Programm geschrieben, welches die Summe aller Primzahlen von 1 bis 2Mio berechnet:
Ich habe ein Array, in welchem ich zunächst 4, später dann alle weiteren, gefundenen Primzahlen speicher.
Jede Zahl von 10 bis 2 Mio wird dann durch eben die Primzahlen aus diesem Array dividiert. Anhand des Ergebnisses wird dann festgestellt, ob die gestete Zahl prim oder eben nicht prim ist.Mein Problem:
Bei sum entsteht nach einer Weile ein overflow. Dabei ist sum doch schon 64 bit groß. Weiß einer, wo der Fehler liegt?
#include <stdlib.h> int main(void){ int i; int j; int count = 4; int count2=0; _int64 sum = 0; int isPrim=1; int prim[150000] = {'\0'}; prim[0]=2; prim[1]=3; prim[2]=5; prim[3]=7; for(i=10;i<2000000;i++){ isPrim=1; j=0; while(prim[j]!='\0'){ if(i%prim[j]==0){ isPrim=0; break; } j++; } if(isPrim==1){ prim[count]=i; count++; sum+=i; printf("%d\n",sum); } } printf("%d\n",sum+2+3+5+7); printf("%d\n",count); system("PAUSE"); return 0; }
-
Hallo,
funktioniert alles bis auf eine Kleinigkeit.
printf interpretiert %d als signed decimal. Also wie int.
printf("%lu\n",sum);
%lu heißt unsigned long int
-
Oh und mit %I64 bekommst du dann auch 64 bit
-
Bei meinem Compiler heißt es
printf( "%Ld", sum);
-
Scheppertreiber schrieb:
Bei meinem Compiler heißt es
printf( "%Ld", sum);
Irgendwie glaube ich das nicht.
-
Nicht schlimm, er macht's halt. Ich verwende das öfter.
-
Compiler: Visual Studio 08
Für %Ld und lu kommt das selbe raus wie für %d.
Und %I64 kennt er nicht. Da erscheint nur eine leere Zeile auf der Konsole.
-
Das muss natürlich (bei MS-Sonderbaustelle) %I64d heissen. Der Standard sieht für
long long
den modifier ll vor. Der modifier L wie ihn Schleppertreiber seltsamerweise verwendet, ist laut Standard nur fürlong double
gedacht. Schönes Compilerwirrwarr.
-
Danke sehr.
-
Tim schrieb:
Das muss natürlich (bei MS-Sonderbaustelle) %I64d heissen. Der Standard sieht für
long long
den modifier ll vor. Der modifier L wie ihn Schleppertreiber seltsamerweise verwendet, ist laut Standard nur fürlong double
gedacht. Schönes Compilerwirrwarr.Kann gut sein, der Watcom macht's halt so.
(Scheppertreiber ohne "l". Es geht um eine Dnepr - das sind russische Gespanne :-))
-
Scheppertreiber schrieb:
(Scheppertreiber ohne "l". Es geht um eine Dnepr - das sind russische Gespanne :-))
Danke für den Hinweis, ist mir bisher echt nicht aufgefallen