Est-il toujours vrai que l' long int
(qui, autant que je comprends, c'est un synonyme long
) 4
octets? puis-je compter sur qui? Si non, pourrait-il être vrai pour une POSIX en fonction de l'OS?
Réponses
Trop de publicités?Les normes ne rien dire quant à la taille exacte de tous les types integer hormis char
. Généralement, long
est de 32 bits sur les systèmes 32 bits et 64 bits sur les systèmes 64 bits.
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és -
int16_t
: signé de 16 bits -
uint16_t
: non signé de 16 bits -
int32_t
: signé de 32 bits -
uint32_t
: non signé de 32 bits -
int64_t
: 64 bits signé -
uint64_t
: 64 bits non signé
L' stdint.h
- tête est décrit dans la section 7.18 de la norme, avec la largeur exacte des types dans la section 7.18.1.1. La norme précise que ces typedefs sont facultatifs, mais ils existent sur la plupart des implémentations.
Non, 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
.
Comme l'a souligné @delnan, POSIX implémentations de maintenir la taille de l' long
et int
comme indéterminé et il diffère souvent entre 32 bits et 64 bits des systèmes.
La longueur de l' long
est principalement de matériel connexe (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).
Pour 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 d' sizeof
- c'est la même que l'écriture d'un nombre, seulement il est portable.
utilisation:
sizeof(long int)
* 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) les types définis par C99 en stdint.h
- comme suggéré par @dbush.