web-dev-qa-db-fra.com

Comment spécifier des entiers 64 bits en c

J'essaie d'utiliser des entiers 64 bits en C, mais j'obtiens des signaux mitigés pour savoir si cela devrait être possible.

Quand j'exécute le printf:

printf("Size of long int:%d\nSize of long long int:%d\n\n",(int)sizeof(long int), (int)sizeof(long long int));

La réponse que je reçois est:

Taille de long int: 4 Taille de long long int: 8

Cela me donne l'impression qu'un long long int a 8 octets = 64 bits.

Cependant, lorsque j'essaie de déclarer les variables suivantes:

long long int a2 = 0x00004444;
long long int b2 = 0x000044440;
long long int c2 = 0x0000444400;
long long int d2 = 0x00004444000;
long long int e2 = 0x000044440000;
long long int f2 = 0x0000444400004;
long long int g2 = 0x00004444000044;
long long int h2 = 0x000044440000444;
long long int i2 = 0x0000444400004444;

Les 4 dernières variables (f2, g2, h2, i2) me donnent le message d'erreur:

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

J'obtiens le même résultat lorsque je remplace 'long long int' par 'int64_t'. Je suppose que 'int64_t' a été reconnu, car il n'a généré aucun message d'erreur.

Donc, il semble que mon int long long de 8 octets est vraiment un long long de 6 octets, et je ne comprends pas ce qui me manque ici. Si cela peut vous aider, voici les informations sur mon compilateur gcc:

me@ubuntu:~$ gcc -v  
Using built-in specs.  
Target: i686-linux-gnu  
Configured with: ../src/configure -v   
--with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5'  
--with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs   
--enable-languages=c,c++,fortran,objc,obj-c++  
--prefix=/usr   
--program-suffix=-4.4   
--enable-shared   
--enable-multiarch   
--enable-linker-build-id   
--with-system-zlib   
--libexecdir=/usr/lib   
--without-included-gettext   
--enable-threads=posix   
--with-gxx-include-dir=/usr/include/c++/4.4   
--libdir=/usr/lib   
--enable-nls   
--with-sysroot=/ -  
-enable-clocale=gnu   
--enable-libstdcxx-debug   
--enable-objc-gc   
--enable-targets=all 
--disable-werror   
--with-Arch-32=i686   
--with-tune=generic   
--enable-checking=release   
--build=i686-linux-gnu   
--Host=i686-linux-gnu   
--target=i686-linux-gnu  
Thread model: posix  
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)   

Si quelqu'un sait comment (ou si) des entiers 64 bits sont accessibles pour moi, j'apprécierais vraiment toute aide. Merci....

50
user1245262

Utilisation stdint.h pour des tailles spécifiques de types de données entiers, et utilisez également des suffixes appropriés pour les constantes littérales entières, par exemple:

#include <stdint.h>

int64_t i2 = 0x0000444400004444LL;
69
Paul R

Essayez un suffixe LL sur le nombre, le compilateur peut le convertir en un type intermédiaire dans le cadre de l'analyse. Voir http://gcc.gnu.org/onlinedocs/gcc/Long-Long.html

long long int i2 = 0x0000444400004444LL;

De plus, le compilateur supprime les zéros non significatifs, donc 0x000044440000 devient 0x44440000, qui est un entier parfaitement acceptable sur 32 bits (c’est pourquoi vous ne voyez aucun avertissement avant f2).

28
Martin Beckett

Utilisation int64_t, ce code portable C99.

int64_t var = 0x0000444400004444LL;

Pour l'impression:

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

printf("blabla %" PRIi64 " blabla\n", var);
5
Karoly Horvath

Comment spécifier des entiers 64 bits en c

Aller contre la habituelle bonne idée d’ajouter LL.

Ajouter LL à une constante entière assurera que le type est au moins aussi large que long long. Si la constante entière est octale ou hexadécimale, la constante devient unsigned long long si besoin.

Si on ne veut pas spécifier un type trop large, alors LL est OK. sinon, lisez la suite.

long long peut être plus large que 64 bits.

Aujourd'hui, il est rare que long long n’est pas 64 bits, pourtant C spécifie long long être au moins 64 bits. Donc, en utilisant LL, à l’avenir, le code pourrait spécifier, par exemple, un nombre de 128 bits.

C a des macros pour les constantes de nombre entier qui, dans le cas ci-dessous, seront de type int_least64_t

#include <stdint.h>
#include <inttypes.h>

int main(void) {
  int64_t big = INT64_C(9223372036854775807);
  printf("%" PRId64 "\n", big);
  uint64_t jenny = INT64_C(0x08675309) << 32;  // shift was done on at least 64-bit type 
  printf("0x%" PRIX64 "\n", jenny);
}

sortie

9223372036854775807
0x867530900000000
3
chux

Ajouter le suffixe ll aux chiffres hexadécimaux pour 64 bits (long long int), ou le suffixe ull pour les fichiers non signés 64 bits (unsigned long long)

1
sbf