sizeof (int) <= sizeof (long) <= sizeof (long long) toujours vrai?

Du standard C, int a au moins 16 bits, long a au moins 32 bits et au moins 64 bits longtemps (le cas échéant) (certaines plates-formes peuvent ne pas prendre en charge). Je me demandais simplement si la phrase en tant que titre était toujours vraie.

Non. La norme ne définit que les plages minimales pour chacun de ces types. Il est concevable que int ait une plage de 16 bits, mais 48 bits de remplissage, ce qui le porte à 64 bits (8 octets, si CHAR_BITS == 8), tandis que long correspond à 32 bits (4 octets).

Bien sûr, ce serait idiot. Mais ce n’est pas interdit en tant que tel.

Notez cependant que sizeof(char) == 1 , par définition. Donc sizeof(char) <= sizeof( toute autre chose ) .

Oui c’est toujours vrai.


Pour clarifier, dans la présente réalité que je connais bien, cela est toujours vrai. Si vous voulez gagner un pari sur le pari, vous pouvez vous référer à la réponse savante de bdonlan , mais si vous rencontrez un jour une implémentation dans laquelle sizeof(int) > sizeof(long) vous avez la permission de donner une bonne exécution à l’implémenteur.

Selon les tables de programmation / référence C , en particulier la table des types de données :

int ≥ 16 ≥ taille du short

long ≥ 32 ≥ taille de int

long long ≥ 64 ≥ taille de long

Comme l’a souligné bdonlan, il s’agit uniquement de la plage des valeurs, pas de la taille en mémoire (taille que renvoie en octets). La norme C ne spécifie pas la taille en mémoire que chaque type peut utiliser, elle est donc laissée à l’implémentation.

La programmation pratique en C ++ dit que

C ++ garantit que le stockage court <= int <= long

Toujours à la recherche de très longtemps .

Au moins pour ISO C ++, cela est bien défini (sauf long long pour des raisons évidentes) par la norme dans 3.9.1 [basic.fundamental] / 2:

Il existe quatre types d’entiers signés: «char signé», «int court», «int» et «long int». Dans cette liste, chaque type fournit au moins autant de stockage que ceux qui le précèdent.

Notez qu’il s’agit de stockage, pas de plages de valeurs. Cela signifie spécifiquement sizeof .