Comment spécifier des entiers 64 bits en c

j'essaie d'utiliser des entiers 64 bits en C, mais je reçois des signaux contradictoires quant à savoir si cela devrait être possible.

Quand j'execute le printf:

printf("Size of long int:%dnSize of long long int:%dnn",(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 fait sentir qu'un 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 message d'erreur:

attention: 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, puisqu'il n'a pas généré de messages d'erreur.

il semble donc que mon int long de 8 octets est en fait un int long de 6 octets, et je ne comprends pas ce que je 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 n'importe qui sait comment (ou si) les entiers 64 bits sont accessibles pour moi, j'apprécierais vraiment toute aide. Grâce....

39
demandé sur smwikipedia 2012-03-07 21:38:54

5 réponses

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

#include <stdint.h>

int64_t i2 = 0x0000444400004444LL;
62
répondu Paul R 2013-05-28 06:59:24

LL suffixe sur le nombre, le compilateur peut être un moulage d'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 se débarrasse des zéros de tête, donc 0x000044440000 devient 0x44440000, qui est un entier 32 bits parfaitement acceptable (c'est pourquoi vous ne voyez aucun avertissement avant f2).

28
répondu Martin Beckett 2015-04-11 14:19:26

Utiliser

int64_t var = 0x0000444400004444LL;

Pour l'impression:

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

printf("blabla %" PRIi64 " blabla\n", var);
5
répondu Karoly Horvath 2012-03-07 17:44:18

comment spécifier des entiers 64 bits en c

aller contre le l'habitude bonne idée l'ajout de LL.

Ajout LL constante entière s'assurer que le type est au moins aussi large que long long. Si le constante entière est octal ou hexadécimal, la constante deviendra unsigned long long si nécessaire.

si on ne se soucie pas de spécifier un type trop large, alors LL est OK. autre chose, lire la suite.

long long peut être plus large que 64 bits.

aujourd'Hui, il est rare que long long n'est pas 64 bits, mais C spécifie long longau moins 64 bits. Donc, à l'aide de LL, dans le futur, le code pourrait spécifier, disons, un nombre de 128 bits.

C A Macros pour les constantes entières 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
répondu chux 2017-06-15 22:17:27

ajouter le suffixe aux chiffres hexadécimaux pour 64 bits (long long long int), ou ull suffixe de 64 bits non signé (unsigned long long)

1
répondu sbf 2012-05-10 13:43:24