75 votes

Puis-je assumer la taille de la "long int" est toujours 4 octets?

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?

117voto

dbush Points 8590

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.

38voto

delnan Points 52260

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.

19voto

Kevin Pandya Points 318

Utilisez le code sizeof(long int) et de 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. Il n'est nulle part quaranteed en C ou POSIX ou n'importe où.

13voto

Myst Points 4110

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.

7voto

Karthik Balaguru Points 845

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X