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....
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;
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
).
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);
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
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)