web-dev-qa-db-fra.com

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

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

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

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

Pourquoi?

82
sud03r

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.-à-d.

long long num3 = 100000000000LL;

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

143
unwind

Essayer:

num3 = 100000000000LL;

Et BTW, en C++, il s’agit d’une extension du compilateur, le standard ne définit pas long long, c’est une partie de C99.

26
Arkaitz Jimenez

Cela dépend dans quel mode vous compilez. long long ne fait pas partie de la norme C++ mais seulement (généralement) supporté en tant qu'extension. Cela affecte le type de littéraux. Les nombres 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 trop long, le résultat est défini par l'implémentation (probablement seulement un nombre de type long int qui a été tronqué pour des raisons de compatibilité ascendante). Dans ce cas, vous devez utiliser explicitement le suffixe LL pour activer l'extension longue longue (sur la plupart des compilateurs).

La prochaine version C++ prendra officiellement en charge une longue durée de manière à ne nécessiter aucun suffixe à moins que vous ne souhaitiez explicitement que le type du littéral soit forcé au moins longtemps. Si le nombre ne peut pas être représenté longtemps, le compilateur essaiera automatiquement de l'utiliser longtemps même sans suffixe LL. Je crois que c'est également le comportement de C99.

4
sellibitze

votre code compile ici bien (même avec cette ligne non commentée. a dû le changer en

num3 = 100000000000000000000;

pour commencer à recevoir l'avertissement.

1
Omry Yadan