!!! Gestion d'entiers de 64 bits !!!

Résolu
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
-
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
-
Bonjour à toutes et à tous.

Je souhaite pouvoir gérer les entiers de 64 bits sous Dev-C++ (et je compte y rester).
Pour cela j'utilise la déclaration de "__int64" ou bien "long long".
Le programme se compile sans broncher sur les types de variables donc il les connait.
Sauf que si dans le code je mets quelque chose du genre : "__int64 Taille = 100000000000;", le compilateur me dit que :
"integer constant is too large for "long" type ".

Si vous avez des propositions ou solutions pour arriver à résoudre ce problème je vous en serais très reconnaissant.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
A voir également:

5 réponses

Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
5
En C99,

long long n = 100000000000LL;


Pour une constante litterale de type __int64 je ne sais pas, regarde dans la documentation du compilateur.
Messages postés
282
Date d'inscription
dimanche 1 avril 2001
Statut
Membre
Dernière intervention
12 février 2007

Le problème est assez simple à comprendre, tu lui as entré le nombre "100000000000", sauf que ce nombre tu l'as entré sans lui préciser que tu voulais qu'il le traite comme un int64, du coup il continue à faire comme si c'était un nombre de 32 bits, et bien sûr c'est beaucoup plus grand que 4294967296. Il doit donc y avoir aussi en plus de ce problème qu'il t'indique, le problème comme quoi tu essayais d'assigner deux types incompatibles (__int64 et long)
Je pense que tu devrais essayer
__int64 Taille = (__int64)100000000000;
Mais j'en doute énormément qu'il t'affecte pour autant la bonne valeur, et penches toi plutôt vers quelque chose du genre, que j'ai trouvé sur google :

void __stdcall Test(HWND hdlg)

{

  char buf[32];

  __int64 r;

   strcpy(buf, "-987654321987654321");

  r = _atoi64(buf);

  _i64toa(r, buf);

  MessageBox(hdlg, buf, szappname, 0);

}

Ou alors, tu devras travailler en mémoire, comme mixer ton __int64 en union façe à deux de 32 bits. Ca devrait être plus rapide à éxécuter qu'avec les api, mais dans certains cas ça pourrait complexifier la chose.

ps: DevC++ n'est qu'un IDE, programme qui relie tous les outils de programmation. Le compilateur c'est plutôt gcc alias mingw.
Et aussi, évites de penser les __int64 comme des "long long", ce qui
n'est pas compatible processeurs 64 bits d'après mes souvenirs.
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
5
unsigned __int64 ou __uint64
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
T'as proposition ne me convient pas car il faut que je puisse gérer facilement sa valeur (ajout ou retrait de valeur, division, ...).
De plus l'erreur du compilateur m'indiquait : "constante trop grande pour loger dans un long", ce qui veut dire qu'il considère la variable Taille comme un long alors qu'il est clair qu'elle est déclarée en __int64. Même en forçant, avec un cast, la variable et la constante, il me met toujours la même erreur.

En tous cas merci de t'être penché sur mon cas c'est très sympa de ta part.
Si tu as une autre idée que la gestion brute en mémoire ça m'arrangerait beaucoup. :-p

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Merci steve_clamage !!!
C'était juste le LL qu'il me fallait.
Evidemment encore 3 fois rien mais fallait le savoir.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"