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ê?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top