J'essaye 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 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 exécuté, il produit des valeurs bien supérieures à 10000000000.
Pourquoi?
c++
types
long-integer
sud03r
la source
la source
<stdint.h>
et de l'utiliseruint64_t
. Pour afficher une valeur 64 bits,printf( "%" PRIu64 "\n", val);
<stdint.h>
inclus,uint64_t a = 0xffffffffffffff; printf( "%" PRIu64 "\n",a ); : error: expected ‘)’ before ‘PRIu64’ printf( "%" PRIu64 "\n",a ); :: warning: spurious trailing ‘%’ in format [-Wformat=] printf( "%" PRIu64 "\n",a );
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-à-direlong long num3 = 100000000000LL;
Le suffixe
LL
transforme le littéral en typelong long
. C n'est pas assez "intelligent" pour conclure cela à partir du type de gauche, le type est une propriété du littéral lui-même, pas le contexte dans lequel il est utilisé.la source
int
,long int
etlong long int
dont la valeur peut être représentée. [C ++ §2.14.2 / 2] Par conséquent, maintenant il n'est pas nécessaire d'ajouter le suffixe 'LL' sur un littéral entier qui est trop grand pour les autres types.Essayer:
num3 = 100000000000LL;
Et BTW, en C ++, il s'agit d'une extension de compilateur, le standard ne définit pas long long, c'est une partie de C99.
la source
Cela dépend dans quel mode vous compilez. long long ne fait pas partie du standard 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 suffisamment grand pour représenter le nombre, long sinon. Si le nombre est encore trop grand pendant 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 devez explicitement utiliser le suffixe LL pour activer l'extension longue longue (sur la plupart des compilateurs).
La prochaine version de C ++ prendra officiellement en charge long long de sorte que vous n'aurez pas besoin de suffixe à moins que vous ne vouliez explicitement que la force du type du littéral soit au moins longue. 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 pense que c'est aussi le comportement du C99.
la source
votre code compile ici très bien (même avec cette ligne non commentée. a dû le changer en
num3 = 100000000000000000000;
pour commencer à recevoir l'avertissement.
la source
long
en ligne avec l'ABI LP64 de cet OS.