longo tempo no C / C ++
-
12-09-2019 - |
Pergunta
Eu estou tentando este código no compilador GNU C ++ e sou incapaz de compreender o seu comportamento:
#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;
}
Quando eu remover o comentário da linha comentada, o código não compilar e está dando um erro:
erro: constante inteira é muito grande por muito tempo tipo
Mas, se o código é compilado como ele é e é executado, ele produz valores muito maiores do que 10.000 milhões.
Por quê?
Solução
As letras 100000000000 tornar-se uma constante literal inteiro, mas o valor é muito grande para o tipo int
. Você precisa usar um sufixo para alterar o tipo do literal, i.
long long num3 = 100000000000LL;
O LL
sufixo torna o literal para o tipo long long
. C não é "inteligente" o suficiente para concluir esta a partir do tipo do lado esquerdo, o tipo é uma propriedade do literal em si, e não o contexto em que ele está sendo usado.
Outras dicas
Tente:
num3 = 100000000000LL;
E BTW, em C ++ é uma extensão do compilador, o padrão não define longo, longo, isso é parte do C99.
Depende em que modo você está compilando. longo longa não é parte do padrão C ++, mas apenas (geralmente) suportado como extensão. Isso afeta o tipo de literais. literais inteiro decimal sem qualquer sufixo são sempre do tipo int se int é grande o suficiente para representar o número, muito contrário. Se o número é ainda muito grande por muito tempo o resultado é definido pela implementação (provavelmente apenas um número do tipo long int que foi truncada para compatibilidade com versões anteriores). Neste caso, você tem que usar explicitamente o sufixo LL para permitir a longa longa extensão (na maioria dos compiladores).
A versão seguinte C ++ vai apoiar oficialmente longa, longa de uma forma que você não vai precisar de qualquer sufixo menos que você queira explicitamente a força o tipo do literal para ser pelo menos o tempo longo. Se o número não pode ser representado em tempo o compilador irá automaticamente tentar usar longo, longo, mesmo sem sufixo LL. Eu acredito que este é o comportamento do C99 também.
seu código compila aqui muito bem (mesmo com essa linha comentada. Teve que mudá-lo para
num3 = 100000000000000000000;
para começar a receber o aviso.