C ++ taille des types intégraux

J’ai entendu des livres, des présentations sur la taille minimale des types intégraux en C / C ++

Les tailles ci-dessous sont en octets:

  • sizeof(char) >= 1
  • sizeof(short) >= 2
  • sizeof(long) >= 4
  • sizeof(long long) >= 8

Mais je ne trouve pas ces garanties dans les normes. Les compilateurs ont-ils donc besoin de garanties pour mettre en œuvre les normes C ++ 98 / C ++ 2003 / C89 / C99?

Parce qu’il n’y en a pas. La norme ne définit que certaines garanties de base et exigences relatives aux valeurs. Vous pouvez les trouver dans ce document à la page 33:

5.2.4.2.1 Tailles des types entiers.

Vous pouvez être sûr que:

 sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long) 

et

 sizeof(float) ≤ sizeof(double) ≤ sizeof(long double) 

Également:

  • sizeof(char) est garanti être 1
  • sizeof(char) == sizeof(signed char) == sizeof(unsigned char)

En outre, sur la plupart des plates-formes:

  • sizeof(char) = 1
  • sizeof(short) = 2
  • sizeof(int) = 4
  • sizeof(long) = 4
  • sizeof(long long) = 8 (1)

(1) long long n’est pas un type standard. GCC et VC ++ le supportent depuis longtemps, mais le support officiel est venu avec C ++ 11:

C ++: types fondamentaux

long long – le type de cible aura une largeur d’au moins 64 bits. (depuis C ++ 11)

Notez que même si sizeof(char) est garanti égal à 1 , cela ne signifie pas qu’il est long de 8 bits. CHAR_BIT définit le nombre de bits dans le type de caractère. De nos jours, presque toutes les architectures utilisent 8 bits par octet, mais certaines architectures plus anciennes en utilisaient 7.

Ce n’est pas correct, vos valeurs sont multipliées par 8. (Notez qu’une taille de 1 ne signifie pas nécessairement 8 bits, le nombre de bits dans un caractère est CHAR_BIT – probablement 8).

Le sizeof(char) est garanti à 1 . (ainsi que unsigned char signed char et signed char ).

Autre que ça,

Le résultat de sizeof appliqué à tout autre type fondamental (3.9.1) est défini par l’implémentation. (5.3.3 Taille de)

Il existe des ressortingctions d’ordre le long des lignes de sizeof(char) <= sizeof(int) <= sizeof(long long) .

Voici ce que dit The C++ Programming Language Fourth Edition by Bjarne Stroustrup à ce sujet.

Les tailles des objects C ++ sont exprimées en termes de multiples de la taille d’un caractère, donc, par définition, la taille d’un caractère est 1.

 • 1 ≡ sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long) • 1 ≤ sizeof(bool) ≤ sizeof(long) • sizeof(char) ≤ sizeof(wchar_t) ≤ sizeof(long) • sizeof(float) ≤ sizeof(double) ≤ sizeof(long double) • sizeof(N) ≡ sizeof(signed N) ≡ sizeof(unsigned N) 

Dans cette dernière ligne, N peut être un caractère, short , int , long ou long long . De plus, il est garanti qu’un caractère a au moins 8 bits, un short au moins 16 bits et un long au moins 32 bits.