Comment la taille de int est-elle décidée?
Est-il vrai que la taille de int dépendra du processeur. Pour une machine 32 bits, ce sera 32 bits et pour 16 bits, 16.
Sur ma machine, il affiche 32 bits, bien que la machine ait un processeur 64 bits et Ubuntu 64 bits installé.
Cela dépend de la mise en œuvre. La seule chose que garantit le standard C est que
sizeof(char) == 1
et
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
et aussi quelques valeurs minimum représentables pour les types, ce qui implique que char
est long d'au moins 8 bits, int
est d'au moins 16 bits, etc.
Cela doit donc être décidé par l’implémentation (compilateur, système d’exploitation, ...) et être documenté.
Cela dépend du compilateur.
Par exemple, essayez un ancien compilateur C turbo et cela donnerait une taille de 16 bits pour un int car la taille du mot (la taille que le processeur pourrait traiter avec le moins d’effort) au moment de l’écriture du compilateur était de 16.
Cela dépend du compilateur principal. si vous utilisez turbo c, la taille de l’entier est de 2 octets. sinon, vous utilisez GNU gccomstackr, cela signifie que la taille de l’entier est de 4 octets. cela dépend de la seule implémentation dans le compilateur C.
La taille de l’entier dépend essentiellement de l’ architecture
de votre système. Généralement, si vous avez une machine 16-bit
, votre comstackr
devra supporter un int de size 2 byte.
Si votre système est de 32 bits, le compilateur doit prendre en charge 4 octets pour l’entier.
En plus de détails,
data bus
de data bus
entre en jeu. Oui, 16 bits, 32 bits ne signifie rien d’autre que la size of data bus
de votre système. x06->16-bit->DOS->turbo c->size of int->2 byte x306->32-bit>windows/Linux->GCC->size of int->4 byte
Faire le plus large possible n’est pas le meilleur choix. (Le choix est fait par les concepteurs ABI .)
Une architecture 64 bits telle que x86-64 peut fonctionner efficacement sur int64_t
, il est donc naturel que 64 bits soit long
. (Microsoft a conservé une long
d’ long
32 bits dans leur ABI x86-64, pour diverses raisons de portabilité qui tiennent compte des API et des bases de code existantes. C’est fondamentalement sans importance, car le code portable qui se soucie réellement de la taille des types devrait utiliser int32_t
et int64_t
au lieu d’être int32_t
à propos de int
et long
.)
Avoir int
be int32_t
réalité un code meilleur et plus efficace dans de nombreux cas. Un tableau de type int
seulement 4B par élément n’a que la moitié de l’empreinte en cache d’un tableau de int64_t
. De plus, la taille par défaut de l’opérande 32 bits est spécifique à x86-64. Par conséquent, les instructions 64 bits nécessitent un octet supplémentaire pour le préfixe REX. La densité de code est donc meilleure avec les entiers 32 bits (ou 8 bits) qu’avec 16 ou 64 bits. (Voir le wiki x86 pour des liens vers docs / guides / ressources d’apprentissage.)
Si un programme nécessite des types entiers 64 bits pour un fonctionnement correct, il n’utilisera pas int
. (Stocker un pointeur dans un int
au lieu d’un intptr_t
est un bogue, et nous ne devrions pas aggraver l’ABI pour accepter un code cassé de la sorte.) Un programmeur écrivant int
probablement prévu un type 32 bits, car la plupart des plates-formes fonctionnent de cette façon. (La norme ne garantit bien sûr que 16 bits).
Comme on ne s’attend pas à ce que int
soit en général à 64 bits (par exemple, sur les plates-formes 32 bits), et le rendant à 64 bits ralentira certains programmes (et presque aucun programme plus rapidement), int
est de 32 bits dans la plupart des ABI à 64 bits.
De plus, il doit y avoir un nom pour un type entier 32 bits, pour que int32_t
soit un typedef
.
Oui. int
taille dépend de la taille du compilateur. Pour un entier 16 bits, la plage de cet entier est comprise entre -32768 et 32767. Pour le compilateur 32 et 64 bits, elle augmentera.