Pregunta

Estoy tratando este código en el compilador C ++ de GNU y soy incapaz de comprender su comportamiento:

#include <stdio.h>;

int main()
{
    int  num1 = 1000000000;
    long num2 = 1000000000;
    long long num3;
    //num3 = 100000000000;
    long long num4 = ~0;

    printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));
    printf("%d %ld %lld %llu", num1, num2, num3, num4);
    return 0;
}

Cuando elimine la línea comentado, el código no se compila y se da un error:

  

error: constante entera es demasiado grande para el tipo largo

Sin embargo, si el código se compila como es y se ejecuta, produce valores muy superiores a 10 mil millones.

¿Por qué?

¿Fue útil?

Solución

Las letras 100000000000 conforman un literal entero constante, pero el valor es demasiado grande para el tipo int. Es necesario utilizar un sufijo para cambiar el tipo de lo literal, es decir.

long long num3 = 100000000000LL;

El LL sufijo hace que el literal en tipo long long. C no es suficientemente "inteligentes" para finalizar este tipo de la de la izquierda, el tipo es una propiedad de la misma literal, no es el contexto en el que se está utilizando.

Otros consejos

Probar:

num3 = 100000000000LL;

Y por cierto, en C ++ esto es una extensión del compilador, la norma no define mucho tiempo, eso es parte de C99.

Depende en qué modo está compilando. largo tiempo no es parte de la C ++ estándar, pero solamente (por lo general) apoyado como extensión. Esto afecta el tipo de literales. literales enteros decimales sin ningún sufijo son siempre de tipo int si int es lo suficientemente grande para representar el número, mucho de lo contrario. Si el número es aún demasiado grande por mucho tiempo el resultado es definido por la implementación (probablemente sólo un número de tipo long int que se ha truncado para la compatibilidad hacia atrás). En este caso hay que utilizar explícitamente el sufijo LL para permitir que el largo tiempo de extensión (en la mayoría de los compiladores).

La siguiente versión de C ++ apoyará oficialmente largo tiempo de una manera que no se necesita ningún sufijo a menos que desee de forma explícita la fuerza del tipo literal ser al menos el tiempo largo. Si el número no se puede representar en mucho el compilador intentará automáticamente el uso a largo tiempo, incluso sin LL sufijo. Creo que este es el comportamiento de C99 también.

Su código se compila aquí muy bien (incluso con esa línea no comentada. Tuvieron que cambiarlo a

num3 = 100000000000000000000;

para empezar a recibir la advertencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top