2009-10-06 7 views
13

pris en charge par GCC:GCC prend-il en charge les longs longs int?

long long int 

qui serait un entier de 64 bits?

De même, est-ce que long long int fait partie de la norme?

+0

Merci tout le monde, je ne l'ai jamais joué avec 64 bits de données avant et je suis terrifié ce soir paresseux. – Polaris878

+0

Notez que dans un environnement C99, vous devriez utiliser 'int64_t' dans' 'pour un entier portable de 64 bits. Si vous n'êtes pas dans un environnement C99, "long long" est votre meilleur pari, mais il n'est pas vraiment garanti d'avoir une largeur de 64 bits. –

+0

ST: Eh bien, il est * garanti * d'être * au moins * 64-bits de large, donc il ne devrait pas s'inquiéter que quelque part là-bas c'est <64. Pas dans une implémentation conforme, de toute façon. – DigitalRoss

Répondre

31

Oui GCC prend en charge long long int, qui fait partie de la norme C99.

La norme ne précise pas sa taille en bits, mais nécessaire valeurs de LLONG_MIN et LLONG_MAX en <limits.h> implique qu'il est au moins 64 bits (exactes types larges entier de 64 bits sont int64_t/uint64_t de <stdint.h>).

  1. LLONG_MIN doit y avoir au plus -9223372036854775807
  2. LLONG_MAX doit être d'au moins 9223372036854775807
+1

Juste pour ajouter .. Dans Windows son équivalent serait _int64 – vpram86

+7

En fait, pour être strict, c'est l'équivalent de int64_t de (qui est aussi C99). –

+0

Je ne connais jamais cet en-tête! Merci! – vpram86

2

Je crois que généralement un unsigned long long est la représentation traditionnelle d'un entier de 64 bits. Je suppose que long long int fonctionnerait aussi, mais je n'ai jamais personnellement vu des vars 64 bits déclarés comme ça avant.

+2

'long long int' est juste un entier signé de 64 bits (ou plus). Rien de particulièrement inhabituel à ce sujet. – bdonlan

8

Sur ma machine 32 bits,

int main() 
{ 
    printf("%d\n", sizeof(long long int)); 
    return 0; 
} 

compilé avec gcc 8 gravures (8 octets * 8 bits/octets = 64 bits).

+18

Les chaînes au format 'size_t' doivent utiliser' "% zu" 'et non' "% d" '(de même,' ssize_t' doit utiliser '"% zd "'). C'est un problème sur les plates-formes 64 bits, où size_t est souvent un type 64 bits, alors que int peut toujours être 32 bits. – bdonlan

+1

sizeof (char) == 1 par définition, mais cela peut être> = un octet. Les types 64 bits sont donc autorisés à avoir sizef (t) == 1. –

5

Oui, long long fait partie de C99, ainsi que les constantes long long (10222333444555LL) et quelques éléments de support. (LLONG_MAX, llrint(d), llround(d), quelques autres.) Et gcc l'a implémenté depuis un certain temps maintenant.

5

Afin d'imprimer de longues variables longues int:

long long int lli = 100000000; 

printf("%lld\n", lli); 
4

long long sont bien soutenus et ont été depuis très longtemps [désolé]. Si je comprends bien, cela aurait dû être 128 bits sur les plates-formes 64 bits, mais pour des raisons de compatibilité/de portabilité dans GCC, a normalisé sur une largeur de 64 bits.

Voir aussi: (u) int128_t, et ce discussion on GCC's 128-bit integer support

+0

"Cela aurait dû être 128 bits sur les plates-formes 64 bits": attention à soutenir cette affirmation de quelque façon que ce soit? –

+0

J'ai dit, "si je comprends bien". Je ne peux soutenir l'idée que dans ce sens, comme le dit wikipedia: "Le terme" mot "est utilisé pour un petit groupe de bits qui sont traités simultanément par les processeurs d'une architecture particulière. Donc, logiquement, un mot long et long serait plus long sur un arc plus large. Cependant, à partir de la même page wikipedia, la norme de facto semble être que long long est de 64 bits. http://en.wikipedia.org/wiki/Integer_%28computer_science%29 –

Questions connexes