2012-06-17 20 views
5

yo estaba tratando de ejecutar este código a través compilador gcc:salida raro sin encasillamiento

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

Pero dio la salida equivocada.

entonces yo probamos este:

#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; 
} 

y se la dio salida correcta!

¿Por qué es esto así?

+1

Tenga en cuenta que solo necesita lanzar una de las constantes para promocionar toda la expresión. – Clifford

Respuesta

9

La expresión 75000 * 75000 es la multiplicación de dos constantes enteras. El resultado de esta expresión también es un número entero y puede desbordarse. El resultado se asigna a un sin signo de larga duración, pero ya se ha desbordado, por lo que el resultado es incorrecto.

Para escribir sin firmar constantes largos largos usar el sufijo ULL.

x = 75000ULL * 75000ULL; 

Ahora la multiplicación no se desbordará.