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....
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;
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
).
Utiliser
int64_t var = 0x0000444400004444LL;
Pour l'impression:
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
printf("blabla %" PRIi64 " blabla\n", var);
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 long
au 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
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)