Question

Je suis en train de ce code sur GNU compilateur C ++ et je suis incapable de comprendre son comportement:

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

Quand je décommenter la ligne commentée, le code ne compile pas et donne une erreur:

  

erreur: constante entière est trop grand pour le type de temps

Mais, si le code est compilé tel qu'il est et est exécuté, il produit des valeurs beaucoup plus que 10.000.000.000.

Pourquoi?

Était-ce utile?

La solution

Les lettres 100000000000 forment un littéral entier constant, mais la valeur est trop grande pour le int type. Vous devez utiliser un suffixe pour changer le type du littéral, i.e..

long long num3 = 100000000000LL;

Le suffixe LL rend le littéral dans le type long long. C est pas assez « intelligent » de conclure ce type de gauche, le type est une propriété du même littéral, et non pas le contexte dans lequel il est utilisé.

Autres conseils

Essayez:

num3 = 100000000000LL;

Et BTW, en C ++ ceci est une extension du compilateur, la norme ne définit pas long long, thats partie de C99.

Cela dépend dans quel mode vous compilez. long long ne fait pas partie du C ++ standard, mais seulement (généralement) pris en charge que l'extension. Cela affecte le type de littéraux. entier décimal littéraux sans suffixe sont toujours de type int si int est assez grand pour représenter le nombre, bien autrement. Si le nombre est encore trop grand pour longtemps le résultat est la mise en œuvre défini (probablement un certain nombre de type long int qui a été tronquée pour la compatibilité descendante). Dans ce cas, vous devez utiliser explicitement le suffixe LL pour permettre l'extension long long (sur la plupart des compilateurs).

La prochaine version C de soutiendra officiellement longtemps longtemps d'une manière que vous aurez pas besoin de suffixe, sauf si vous voulez explicitement la force de type de littéral être au moins long long. Si le nombre ne peut pas être représenté dans longtemps le compilateur essaiera automatiquement d'utiliser longtemps longtemps, même sans suffixe LL. Je crois que c'est le comportement de C99 ainsi.

votre code compile ici bien (même avec cette ligne décommentée. Dû changer à

num3 = 100000000000000000000;

pour commencer à obtenir l'avertissement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top