KeniiyK
Messages postés326Date d'inscriptionvendredi 13 août 2004StatutMembreDernière intervention 2 novembre 2007
-
2 nov. 2007 à 00:45
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 2014
-
2 nov. 2007 à 04:20
Bonsoir,
Si quelqu'un a un processeur 64 bit, peut il me dire si l'adressage est sur 32 bits ou sur 64 bits ?
Que valent les renvoies de sizeof( int ) et sizeof( void* ) sur ces machines ?
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 2 nov. 2007 à 01:31
Salut,
sizeof() n'est pas une fonction. C'est plutôt un opérateur utilisé par le compilateur pour déterminer la taille en octet de la variable, le type de variable, ou l'expression, qui lui est passée en paramètre. Le résultat est inscrit en dur dans l'exécutable.
Pour les outils Microsoft, un int et un long sont des valeurs 32 bits sur un système 64 bits. Donc aucun changement de ce coté. Par contre, tous les pointeurs sont de 64 bits sur un système 64 bits.
On aura donc pour les systèmes 64 bits:
sizeof(int) -> 4 octets = 32 bits sizeof(void*) -> 8 octets = 64 bits
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 2 nov. 2007 à 04:20
Il y'a le type __int64 ou unsigned __int64 redéfinis en INT64, LONGLONG, DWORDLONG et ULONGLONG.
LPARAM et WPARAM sont des valeurs 64 bits sur un système 64 bits. C'est normal car ils peuvent être des pointeurs.
Il ne faut donc pas caster ou convertir un pointeur en une valeur 32 bits.
Les types, INT_PTR, UINT_PTR, LONG_PTR, et ULONG_PTR peuvent être de 32 bits ou 64 bits selon le mode de compilation (32 ou 64 bits).
__int64 = de -9223372036854775808 à 9223372036854775807
unsigned __int64 = de 0 à 18446744073709551615
KeniiyK
Messages postés326Date d'inscriptionvendredi 13 août 2004StatutMembreDernière intervention 2 novembre 20072 2 nov. 2007 à 02:02
Ok, merci pour vos réponses, et rapides !! (vu l'heure et la date). J'en conclue que seul l'adressage est modifié. Mais c'est un peu déroutant, à part le type primitif "double" aucun autre n'est sur 64 bits, pour garder la conversion (long) -> (void*) comme pour les LPARAM et autre ? (le cast est respecté par le compilo comme je me doute en low bit). Où est la limitation des entiers signés / non signés sur 64 bits (on considère que c'est du 32 et basta ? ) ?