Comment forcer l’arithmétique des entiers 64 bits sur OS X?

J’essaie de forcer des entiers longs de 64 bits sous OS X 10.5.6. fonctionnant sur un Apple MacBook Intel Core 2 Duo. Voici mon code c:

#include int main() { long a = 2147483647; /*== 2^32 - 1*/ long aplus1; printf("a== %d. sizeof(a) == %d \n", a, sizeof(a)); aplus1 = a+1; printf("aplus1 = %d \n", aplus1); } 

La compilation sans aucun commutateur donne les résultats suivants:

 $ gcc testlong.c -o testlong ;./testlong a== 2147483647. sizeof(a) == 4 aplus1 = -2147483648 

La compilation avec le commutateur -m64 donne:

 $ gcc testlong.c -o testlong -m64; ./testlong a== 2147483647. sizeof(a) == 8 aplus1 = -2147483648 

La deuxième version utilise donc apparemment le stockage 64 bits, mais génère toujours l’erreur de dépassement de capacité, bien que 2 ^ 32 devrait se situer bien dans la plage d’un entier 64 bits. Des idées?

Je préférerais une solution qui peut être forcée à partir d’une option gcc plutôt que de m’obliger à modifier plusieurs lignes de code source (mon problème actuel n’est pas l’exemple ci-dessus, mais j’ai plutôt besoin de forcer l’arithmétique sur les entiers longs dans une situation plus générale).

Non seulement vous devez utiliser long long, mais vous devez également modifier les instructions printf () en conséquence.

 #include int main() { long long a = 2147483647; /*== 2^32 - 1*/ long long aplus1; printf("a== %lld. sizeof(a) == %d \n", a, sizeof(a)); aplus1 = a+1; printf("aplus1 = %lld \n", aplus1); } 

% lld est le code pour long long.

Apparemment, les vrais programmes 64 bits peuvent utiliser% d pour les entiers 64 bits – je ne sais pas s’il est possible de le configurer pour la compilation dans ce mode.

Si vous utilisez C99, incluez stdint.h et utilisez uint64_t et int64_t . Autre que cela, unsigned long long a = 0x100000000ull; devrait fonctionner aussi.

Utilisez le standard C99:

 #include  uint64_t a = 2147483647ULL; 

Dinkumware offre un excellent aperçu de la bibliothèque C99 .

As-tu essayé:

 long long a = 2147483647; 

Le code 2147483647 dans le code C est de type int . Si vous voulez que ce soit long , cela ne sert à rien d’avoir un long côté gauche, c’est toujours un int sur la droite.

Faites-en un long littéral, en ajoutant un ‘L’: 2147483647L (les majuscules sont recommandées, les minuscules ‘l’ fonctionnent aussi mais peuvent être très déroutantes en fonction de la police).