web-dev-qa-db-fra.com

Taille du pointeur int et sizeof int sur une machine 64 bits

Je me demandais simplement comment savoir si mon ordinateur portable est une machine 64 ou 32 bits. (c'est un 64).

J'ai donc pensé à imprimer ce qui suit:

int main()
{
 printf("%d",sizeof(int));
}

et le résultat était 4, ce qui semblait étrange (car il s'agit d'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:

Étant donné que j'utilise une machine 64 bits, un type primitif tel que int ne devrait-il pas utiliser 8 octets

(64 bits) et par ce sizeof int devrait être 8? Pourquoi n'en est-il pas ainsi?

Et pourquoi la taille int * est-elle 8?

Un peu confus ici,

merci d'avance.

26
Itzik984

Non, la sizeof(int) est définie par l'implémentation et fait généralement 4 octets.

D'un autre côté, pour adresser 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 simplement l'adresse "quelque part en mémoire", et vous ne pouvez pas adresser plus de 4 Go de mémoire avec seulement 32 bits.

24
ScarletAmaranth

La taille d'un pointeur doit être de 8 octets sur tout compilateur C/C++ 64 bits, mais il n'en va pas de même pour la taille de int.

Le wiki a une bonne explication à ce sujet:

Dans de nombreux environnements de programmation pour les langages dérivés C et C sur des machines 64 bits, les variables "int" ont toujours une largeur de 32 bits, mais les entiers longs et les pointeurs ont une largeur de 64 bits. Ceux-ci sont décrits comme ayant un modèle de données LP64. Une autre alternative est le modèle de données ILP64 dans lequel les trois types de données ont une largeur de 64 bits, 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 simples, et de nombreux programmes bien écrits peuvent simplement être recompilés pour le nouvel environnement sans modifications. Une autre alternative est le modèle LLP64, qui maintient la compatibilité avec le code 32 bits en laissant à la fois int et long comme 32 bits. "LL" fait référence au type "entier long long", qui est d'au moins 64 bits sur toutes les plates-formes, y compris les environnements 32 bits.

16
Rahul Tripathi

La sizeof(int), sizeof(int*) et la "taille de la machine", bien que souvent corrélées les unes aux autres, peuvent chacune être indépendamment plus petites, identiques ou plus grandes que les autres. À propos de la seule exigence C est qu'ils soient au moins 16 bits (ou plus) - à part cela, il dépend du compilateur pour la sizeof(int), sizeof(int*).

(Bien qu'un pointeur doive être au moins de taille int. Hmmm)

3
chux

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 de 64 bits, vous ne pourriez pas avoir les trois tailles 8, 16 et 32 ​​bits. C'est pourquoi les compilateurs ont tendance à faire int = 32 bits, vous pouvez donc avoir char = 8 bits, short = 16 bits, int = 32 bits, long long = 64 bits et long = 32 bits ou 64 bits.

2
gnasher729

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);
0
SuperJOE