largo tiempo en C / C ++

Estoy intentando este código en el comstackdor C ++ de GNU y no puedo entender su comportamiento:

#include ; 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 elimino el comentario de la línea comentada, el código no se comstack y está dando un error:

error: la constante entera es demasiado grande para el tipo largo

Pero, si el código se comstack tal como está y se ejecuta, produce valores mucho más grandes que 10000000000.

¿Por qué?

Las letras 100000000000 constituyen una constante literal entera, pero el valor es demasiado grande para el tipo int . Debe usar un sufijo para cambiar el tipo del literal, es decir,

 long long num3 = 100000000000LL; 

El sufijo LL convierte el literal en tipo long long . C no es lo suficientemente “inteligente” como para concluir esto del tipo de la izquierda, el tipo es una propiedad del literal en sí, no el contexto en el que se está utilizando.

Tratar:

 num3 = 100000000000LL; 

Y por cierto, en C ++ esta es una extensión del comstackdor, el estándar no define mucho tiempo, eso es parte de C99.

Depende del modo que estés comstackndo. long long no forma parte del estándar de C ++, pero solo (por lo general) se admite como extensión. Esto afecta el tipo de literales. Los literales enteros decimales sin ningún sufijo son siempre del tipo int si int es lo suficientemente grande como para representar el número, de lo contrario, long. Si el número es demasiado grande por mucho tiempo, el resultado está definido por la implementación (probablemente solo una cantidad de tipo long int que se truncó para compatibilidad con versiones anteriores). En este caso, debe usar explícitamente el sufijo LL para habilitar la extensión larga larga (en la mayoría de los comstackdores).

La próxima versión de C ++ será oficialmente compatible por mucho tiempo de manera que no necesitará ningún sufijo a menos que desee explícitamente que la fuerza del tipo del literal sea al menos larga. Si el número no puede representarse en mucho tiempo, el comstackdor intentará usarlo automáticamente incluso sin el sufijo LL. Creo que este es el comportamiento de C99 también.

su código comstack aquí bien (incluso con esa línea sin comentario.) tuvo que cambiarlo a

 num3 = 100000000000000000000; 

para comenzar a recibir la advertencia.