Puis-je assumer la taille de long int est toujours 4 octets?
Est-il toujours vrai que long int
(qui, autant que je comprends, c'est un synonyme de long
) est 4
octets?
Puis-je compter sur qui? Si non, pourrait-il être vrai pour une POSIX en fonction de l'OS?
- Juste pour vous rappeler les gars qui
sizeof
tient compte de rembourrage et de l'alignement. Il est conforme à la norme d'avoir unsizeof(unsigned long)
de 8 octets, mais le débordement se comporte comme 4 octets. C'est la façon de mal à essayer d'utiliser dessizeof
etCHAR_BITS
pour calculer la limite d'un type entier. Utilisationlimits.h
quand il doit être utilisé. - Vous devriez vraiment lire le (abrégée en premier, puis la version complète de la) C-faq, qui est apparu sur Usenet à une époque où il était le lieu où les gens avec des connaissances sur un sujet, réunis dans le même lieu (aujourd'hui, il est largement répandus au sein de plusieurs sites...), et par conséquent, il conduit à incroyablement exhaustives et bien fait Faq. Voir c-faq.com/versions.html . La lecture qu'il ouvre les yeux sur cette question et sur des dizaines d'autres, vous ne savez même pas que vous devez connaître encore (section 5 - pointeurs null - est l'une contenant de la Faq, j'ai été choqué (et de reconnaissance) à découvrir)
- non, c'est 8 sur mon pc
- Double Possible de Plage de valeurs dans C Int et Long 32 - 64 bits
- Cela pourrait être vrai, mais, non, vous ne pouvez pas compter sur elle. Cela fait 8 octets sur la plupart des systèmes qui j'ai travaillé pendant près de 20 ans.
- Il est à 8 sur la plupart des systèmes 64 bits (par exemple, x86-64 Linux et OS X). Windows est la principale exception, car une grande partie du code écrit pour Windows 32 bits a été écrit pour Windows 32 bits, avec peu ou pas d'effort pour écrire du code portable qui ne font pas d'hypothèse. Aussi pour ABI raisons: je pense que certaines structures ont
long
s dans leurs définitions, mais ils n'ont pas besoin d'être 64 bits. Donc MS a décidé de fairelong
32 bits à garder les structures de la même taille dans leur ABIs et pour les bases de code. - Ce que fait le C++ standard de l'état de la taille d'un int, long type?
Vous devez vous connecter pour publier un commentaire.
Les normes de dire que rien de ce qui concerne la taille exacte de tous les types integer côté de
char
. Généralement,long
est de 32 bits sur les systèmes 32 bits et 64 bits sur les systèmes 64 bits.La norme n'est toutefois spécifier un minimum taille. À partir de la section 5.2.4.2.1 de la C Standard:
Il dit que l'un
long int
doit être d'un minimum de 32 bits, mais peut-être plus. Sur une machine oùCHAR_BIT
est de 8, ce qui donne un minimum d'octets taille de 4. Cependant sur la machine, avec, par exemple,CHAR_BIT
égal à 16, unlong int
pourrait être de 2 octets.Voici un exemple réel. Pour le code suivant:
Sortie sur Debian 7 i686:
Sortie sur CentOS 7 x64:
Donc non, vous ne pouvez pas faire d'hypothèses sur la taille. Si vous avez besoin d'un type d'une taille spécifique, vous pouvez utiliser les types définis dans
stdint.h
. Il définit les types suivants:int8_t
: 8 bits signéuint8_t
: 8 bits non signésint16_t
: signé de 16 bitsuint16_t
: non signé de 16 bitsint32_t
: 32-bit signéuint32_t
: non signé de 32 bitsint64_t
: 64 bits signéuint64_t
: 64 bits non signéLa
stdint.h
en-tête est décrit dans la section 7.20 de la norme, avec la largeur exacte des types dans la section 7.20.1.1. La norme précise que ces typedefs sont facultatifs, mais ils existent sur la plupart des implémentations.uint64_t
ne font pas partie de la norme avant C11. Peut-être que vous devriez dire.1 == sizeof(char) == sizeof(int)
. Pourriez-vous fournir un devis précis de la norme qui dit que "int
est au moins 2 octets"?sizeof
1, bien sûr) rend le travail avec les données de 8 bits encodages de texte douloureux, mais en général, les plateformes comme qui ne sont pas utilisés pour un traitement de texte.long
est généralement 64 bits, car il n'est pas sur Windows, et Windows est une sorte de largement utilisé. La norme elle-même ne définit pas de cela, bien sûr, de sorte que les deux implémentations de la norme-conforme, mais le résultat final est des tonnes de unix C (et C++) du code qui tronque les pointeurs 64 bits sur Windows (juste arrêter de stocker des pointeurs sur des entiers déjà, nom d'une pipe! :D). Bien sûr, c'est fondamentalement causée par l'utilisation d'un type que standard dispose d'une gamme de [-2147483647, +2147483647] pour stocker des valeurs, plus que cela, ce qui est un peu ridicule, mais bon 🙂char
est définie comme la tenue d'un caractère, et il est également défini qu'il n'y est pas de type plus étroit quechar
. Nous pouvons déduire de tout cela que les "byte" est le minimum adressable (unité de toutes les unités adressables que le compilateur prend en charge, c'est pas forcément une propriété de la cible).CHAR_BIT
être exactement 8 etint
au moins 32 bits (au lieu du minimum de 16 bits requis par la norme ISO C).Pas, ni la norme, ni POSIX garantie de cela en fait la plupart des systèmes Unix-like plates-formes 64 bits ont un 64 bits (8 octets)
long
.Utiliser le code
sizeof(long int)
et vérifier la taille. Il vous donnera la taille de long int en octets sur le système que vous travaillez actuellement. La réponse à votre question, en particulier, est NON. Elle n'est pas garanti dans C ou POSIX ou n'importe où.sizeof(long int)
facteurs de rembourrage et de l'alignement des restrictions dans son résultat. Il est parfaitement valable poursizeof
de retour "16", même si vous êtes uniquement autorisé à utiliser quatre de ces octets.Comme l'a souligné @delnan, POSIX implémentations de garder la taille de
long
etint
comme indéterminé et il diffère souvent entre 32 bits et 64 bits des systèmes.La longueur de
long
est principalement matériel connexes (souvent assorti de la taille des registres de données sur le CPU et parfois d'autres logiciels de questions connexes telles que les OS de la conception et de l'ABI interfaçage).À soulager votre esprit,
sizeof
n'est pas une fonction, mais une directive de compilation*, de sorte que votre code n'est pas en utilisant des opérations lors de l'utilisation desizeof
- c'est la même que l'écriture d'un nombre, seulement il est portable.utilisation:
* Comme Dave l'a souligné dans les commentaires,
sizeof
sera calculé au moment de l'exécution lorsqu'il est impossible de calculer la valeur lors de la compilation, comme lors de l'utilisation de la variable de tableaux de longueur.Aussi, comme l'a fait remarquer dans un autre commentaire,
sizeof
prend en considération le rembourrage et l'alignement utilisé par la mise en œuvre, ce qui signifie que les octets en cours d'utilisation peut être différente de la taille de la mémoire (ce qui pourrait être important lorsque le décalage de bits).Si vous êtes à la recherche pour certains d'octets de taille variables, envisagez l'utilisation d'un tableau d'octets ou (je suppose que pour être pris en charge) les types définis par C99 dans
stdint.h
- comme suggéré par @dbush.usually
àmostly
et ajouter une info dans la parenthèse.sizeof
est une directive de compilation, de supprimer toute perception raisons que n'importe qui pourrait avoir pour deviner à la taille.sizeof
est calculée au moment de l'exécution lorsque (et si) vous utilisez une Longueur Variable de Matrice ou une variable du type modifié en C99 ou plus tard (ou "gnu89" comme GCC extension), mais la plupart du code ne fait pas cela.Lorsque nous avons d'abord mis en œuvre C sur ICL Série 39 matériel, nous avons pris la norme à sa parole et cartographié les types de données à la représentation naturelle sur l'architecture de la machine, qui a été
short
= 32 bits,int
= 64 bits,long
= 128 bits.Mais nous avons constaté qu'aucun de graves C applications travaillé; ils ont tous assumé la cartographie
short
= 16,int
= 32,long
= 64, et nous avons dû changer le compilateur à l'appui que.Donc quelle que soit la norme officielle dit, pendant de nombreuses années, tout le monde a convergé sur
long
= 64 bits et il ne risque pas de changer.La standard ne dit rien sur la taille de
long int
, de sorte qu'il dépend de l'environnement dans lequel vous utilisez.Pour obtenir la taille de
long int
sur votre environnement, vous pouvez utiliser lesizeof
opérateur et obtenir la taille delong int
. Quelque chose commeSource
Le compilateur détermine la taille en fonction du type de matériel et de système d'exploitation.
Donc, les hypothèses doivent pas être faites au sujet de la taille.
De Usrmisc du Blog:
De sorte que vous ne pouvez pas.
D'ailleurs
long int
est le même quelong
.Réponse courte: Non! Vous ne pouvez pas faire fixe des hypothèses sur la taille de
long int
. Parce que, la norme (norme C ou POSIX) n'a pas de document de la taille delong int
(comme souligné à plusieurs reprises). Juste pour donner un contre-exemple à votre croyance, la plupart des systèmes 64 bits ontlong
de taille de 64! Afin de maximiser la portabilité utilisationsizeof
de façon appropriée.Utilisation
sizeof(long int)
pour vérifier la taille, il retourne la taille delong
en octets. La valeur du système ou de l'environnement à charge; sens, le compilateur détermine la taille en fonction du matériel et des OS.