long long en C / C++

J'essaie ce code sur le compilateur C++ de GNU 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;
}

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

Erreur: la constante entière est trop grande pour le type long

, Mais, si le code est compilé et exécuté, il produit des valeurs beaucoup plus grandes que 10000000000.

Pourquoi?

79
demandé sur Peter Mortensen 2009-09-22 13:01:19

4 réponses

Les lettres 100000000000 constituent une constante entière littérale, mais la valeur est trop grande pour le type int. Vous devez utiliser un suffixe pour changer le type du littéral, c'est-à-dire

long long num3 = 100000000000LL;

Le suffixe LL transforme le littéral en type long long. C n'est pas assez "intelligent" pour conclure cela à partir du type à gauche, le type est une propriété du littéral lui-même, pas le contexte dans lequel il est utilisé.

139
répondu unwind 2009-09-22 09:02:55

Essayez:

num3 = 100000000000LL;

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

26
répondu Arkaitz Jimenez 2009-09-22 09:14:02

Cela dépend dans quel mode vous compilez. long long ne fait pas partie de la norme C++ mais seulement (généralement) pris en charge comme extension. Cela affecte le type de littéraux. Les littéraux entiers décimaux sans suffixe sont toujours de type int Si int est assez grand pour représenter le nombre, long sinon. Si le nombre est même trop grand pour longtemps, le résultat est défini par l'implémentation (probablement juste un nombre de type long int qui a été tronqué pour la compatibilité descendante). Dans ce cas, vous doivent utiliser explicitement le suffixe LL pour activer l'extension long long (sur la plupart des compilateurs).

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

4
répondu sellibitze 2009-09-22 09:56:36

Votre code se compile ici bien (même avec cette ligne non commentée. j'ai dû le changer en

num3 = 100000000000000000000;

Pour commencer à recevoir l'avertissement.

1
répondu Omry Yadan 2009-09-22 09:05:25