2012-06-17 17 views
5

stavo cercando di eseguire questo codice tramite il compilatore gcc:uscita strano senza typecasting

#include <stdio.h> 
int main() 
{ 
    unsigned long long int x; 
    x = 75000 * 75000; 
    printf ("%llu\n", x); 
    return 0; 
} 

Ma dato uscita sbagliata.

Allora ho provato questo:

#include <stdio.h> 
int main() 
{ 
    unsigned long long int x; 
    x = (unsigned long long)75000 * (unsigned long long)75000; 
    printf ("%llu\n", x); 
    return 0; 
} 

e ha dato uscita corretta!

Perché è così?

+1

Si noti che è necessario eseguire il cast di una delle costanti per promuovere l'intera espressione. – Clifford

risposta

9

L'espressione 75000 * 75000 è la moltiplicazione di due costanti integer. Il risultato di questa espressione è anche un numero intero e può overflow. Il risultato viene quindi assegnato a un long lungo non firmato, ma è già stato sovraccaricato e il risultato è sbagliato.

Per scrivere le costanti lunghe lunghe senza segno, utilizzare il suffisso ULL.

x = 75000ULL * 75000ULL; 

Ora la moltiplicazione non sarà eccessiva.