web-dev-qa-db-fra.com

Sizeof renvoie-t-il le nombre d'octets ou le nombre d'octets d'un type en C?

Simplement en C et en variantes (contrairement à Java avec sa machine virtuelle), la taille des types primitifs sur différentes cibles peut varier considérablement, et il n’ya vraiment de garantie que si vous utilisez les types à largeur fixe définis dans stdint.h, et même dans ce cas, votre implémentation doit les soutenir.

De toute façon hypothétiquement (parce que sur la plupart des machines modernes, un octet est un octet, pour des raisons de réseau, je suppose (ASCII)), sizeof renvoie-t-il la taille d’un type de données en octets ou en octets?

16
awiebe

Answer: sizeof renvoie la taille du type en octets .


Exemple: sizeof(char) est garanti à 100% comme étant 1, mais cela ne signifie pas qu’il s’agit d’un octet (8 bits).


Prouvé par le standard: 

au 6.5.3.4, point 2:

L'opérateur sizeof donne la taille (en octets) de son opérande , qui peut être une expression Ou le nom entre parenthèses d'un type. La taille est déterminée à partir du type d'opérande . Le résultat est un entier. Si le type de l'opérande est un type de tableau de longueur variable , L'opérande est évalué; sinon, l'opérande n'est pas évalué et le résultat est une constante entière .

...

Lorsqu'il est appliqué à un opérande de type char, non signé ou signé, (Ou une version quali fi ée de celui-ci), le résultat est 1 . Appliqué à un opérande de type tableau , Le résultat est le nombre total d'octets du tableau.) Appliqué à un opérande De type structure ou union, le résultat est le nombre total d’octets dans un tel objet, , y compris le remplissage interne et final.

De plus, à la section 3.6, point 3:

Un octet est composé d'une séquence de bits contigus, dont le nombre est défini par la mise en oeuvre.

17
Kiril Kirov

sizeof donne la taille en octets. Cependant, notez que "octet" est un terme technique dans la norme C et est défini de manière à ce que sizeof(char) == 1.

6
Stephen Canon

sizeof renvoie toujours size en nombre d'octets. Mais selon wikipedia :

Dans les langages de programmation C et C++, l'opérateur unaire sizeof est utilisé pour calculer la taille de tout type de données, mesurée en nombre d'octets requis pour représenter le type. Un octet dans ce contexte est identique à un caractère non signé, et peut être plus grand que 8 bits, bien que ce soit rare

5
Justin Ethier

De ma propre expérience, en travaillant sur des micro-contrôleurs embarqués avec des compilateurs «C» exotiques, j'ai constaté:

sizeof( uint8 )

retour 1

sizeof( uint16 )

retour 1

sizeof( uint32 )

retour 2

Clairement, je traitais avec une machine où la plus petite entité adressable était de 16 bits, donc la taille ne correspond pas à C89 ou à C99.

Je dirais que sur les systèmes traditionnels conformes aux normes C89 et C99, la réponse acceptée est correcte. Malheureusement, un compilateur "C" peut toujours être appelé un compilateur "C", même s'il ne respecte pas les 25 ans ancien standard. J'espère que cette réponse aidera à mettre les choses en perspective, étant donné les systèmes plus exotiques.

2
Bamaco