_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ür long 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ür long 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 😞


Anmelden zum Antworten