GNU/Linux >> Tutoriels Linux >  >> Linux

Puis-je supposer que la taille de long int est toujours de 4 octets?

Les normes ne disent rien concernant la taille exacte des types entiers à part char . Typiquement, long est 32 bits sur les systèmes 32 bits et 64 bits sur les systèmes 64 bits.

La norme spécifie cependant un minimum Taille. Extrait de la section 5.2.4.2.1 de la norme C :

1 Les valeurs données ci-dessous doivent être remplacées par des expressions constantes utilisables en #if directives de prétraitement. De plus, sauf pour CHAR_BIT et MB_LEN_MAX , les éléments suivants doivent être remplacés par des expressions qui ont le même type que le serait une expression qui est un objet du type correspondant converti selon les promotions entières. Leurs valeurs définies par la mise en œuvre doivent être égales ou supérieures en amplitude (valeur absolue) à celles indiquées, avec le même signe.

...

  • valeur minimale pour un objet de type long int

    LONG_MIN -2147483647 // −(2^31−1)

  • valeur maximale pour un objet de type long int

    LONG_MAX +2147483647 // 2^31−1

Cela dit qu'un long int doit être un minimum de 32 bits, mais peut être plus grand. Sur une machine où CHAR_BIT est de 8, cela donne une taille d'octet minimale de 4. Cependant, sur une machine avec par ex. CHAR_BIT égal à 16, un long int peut avoir une longueur de 2 octets.

Voici un exemple concret. Pour le code suivant :

#include <stdio.h>

int main ()
{
    printf("sizeof(long) = %zu\n", sizeof(long));
    return 0;
}

Sortie sur Debian 7 i686 :

sizeof(long) =4

Sortie sur CentOS 7 x64 :

sizeof(long) =8

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é
  • int16_t :16 bits signé
  • uint16_t :16 bits non signé
  • int32_t :32 bits signé
  • uint32_t  :32 bits non signés
  • int64_t  :64 bits signés
  • uint64_t  :64 bits non signés

Le stdint.h header est décrit dans la section 7.20 de la norme, avec les types de largeur exacte dans la section 7.20.1.1. La norme stipule que ces typedefs sont facultatifs, mais ils existent sur la plupart des implémentations.


Non, ni le standard C ni POSIX ne le garantissent et en fait la plupart des plates-formes 64 bits de type Unix ont un long 64 bits (8 octets) .


Linux
  1. Erreur OpenStack - Taille de colonne d'index trop grande. La taille de colonne maximale est de 767 octets [Résolu]

  2. Quelle est la taille du tampon de tuyau ?

  3. Trouver la taille du secteur d'une partition ?

  4. Pourquoi Ls et Hexdump ne sont-ils pas d'accord sur la taille du fichier ?

  5. Obtenir la taille de la base de données dans MySQL

Comment obtenir la taille d'un répertoire sous Linux

Comment trouver la taille totale d'un répertoire sous Linux

Pourquoi la taille d'un répertoire est-elle toujours de 4096 octets sous Unix ?

Puis-je augmenter la taille d'une image disque basée sur un fichier ?

Puis-je changer le SID d'une base de données Oracle ?

Comment puis-je trier la sortie du -h par taille