Taille du pointeur int et sizeof int sur une machine 64 bits
Je me demandais juste comment puis-je savoir si mon ordinateur portable est une machine 64 ou 32 bits. (il est un 64).
Donc, j'ai pensé à imprimer ce qui suit:
int main()
{
printf("%d",sizeof(int));
}
Et le résultat était 4, ce qui semblait bizarre (puisque c'est une machine 64 bits)
Mais, quand j'ai imprimé ceci:
int main()
{
printf("%d",sizeof(int*));
}
Le résultat était 8, ce qui était plus logique.
La question Est:
Puisque j'utilise une machine 64 bits, un type primitif tel que int ne devrait-il pas utiliser 8 octets
(64 bits) et par que sizeof int devrait être 8? Pourquoi n'est-il pas ainsi?
Et pourquoi la taille int * est-elle 8?
Un peu confus, ici,
Donc merci d'avance.
5 réponses
Non, le sizeof(int)
est l'implémentation définie, et est généralement de 4 octets.
D'autre part, pour traiter plus de 4 Go de mémoire (ce que les systèmes 32 bits peuvent faire), vous avez besoin que vos pointeurs aient une largeur de 8 octets. int*
contient juste l'adresse à "quelque part dans la mémoire" , et vous ne pouvez pas adresser plus de 4 Go de mémoire avec seulement 32 bits.
La Taille d'un pointeur doit être de 8 octets sur n'importe quel compilateur C/C++ 64 bits, mais la même chose n'est pas vraie pour la taille de int.
Le wiki a une bonne explication à cela:
Dans de nombreux environnements de programmation pour les langages Machines 64 bits, variables " int " sont toujours 32 bits de large, mais long les entiers et les pointeurs ont une largeur de 64 bits. Ces derniers sont décrits comme ayant un modèle de données LP64. Une autre alternative est le modèle de données ILP64 dans quelles sont les trois données les types sont 64 bits de large, et même SILP64 où les entiers "courts" ont également une largeur de 64 bits.[citation nécessaire] Cependant, dans la plupart des cas les modifications requises sont relativement mineures et simple, et de nombreux programmes bien écrits peuvent simplement être recompilés pour le nouvel environnement sans modifications. Un autre alternative est le modèle LLP64, qui maintient la compatibilité avec Code 32 bits en laissant int et long comme 32 bits. "LL" fait référence à la "long entier long", qui est au moins 64 bits sur toutes les plateformes, y compris les environnements 32 bits.
Le sizeof(int)
, sizeof(int*)
, et la" taille de la machine", bien que souvent corrélée les unes aux autres, peut chacune être indépendamment plus petite, la même ou plus grande que les autres. A propos de la seule exigence C est qu'ils soient au moins 16 bits ( ou plus) - autre que cela, il dépend du compilateur pour le sizeof(int)
, sizeof(int*)
.
(Bien que peut - être un pointeur doit être au moins une taille int. Hmmm)
Les programmeurs aiment avoir des types entiers de 1, 2, 4 et 8 octets ou 8, 16, 32 et 64 bits. Il n'y a que deux types entiers qui pourraient être plus petits que int: char et short. Si int était 64 bits, vous ne pouviez pas avoir les trois tailles 8, 16 et 32 bits. C'est pourquoi les compilateurs ont tendance à faire des int = 32 bits, de sorte que vous pouvez avoir char = 8 bits, court = 16 bits, int = 32 bits, long = 64 bits et long = 32 bits ou 64 bits.
En raison de size_t a été défini comme
typedef unsigned int size_t;
Vous devez l'afficher avec %zu, % u ou %lu au lieu de %D.
printf("%zu\n", sizet);
printf("%u\n", sizet);
printf("%lu\n", sizet);