2012-08-08 6 views
15

Simplement mis en C et variantes (contrairement à wuss java avec sa machine virtuelle) la taille des types primitifs sur différentes cibles peut varier considérablement, et il n'y a vraiment aucune garantie sauf si vous utilisez les types de largeur fixe définis dans stdint.h, et même alors Votre implémentation doit les soutenir. Quoi qu'il en soit hypothétiquement (parce que sur la plupart des machines modernes, un octet est un octet, pour des raisons de réseautage je suppose (ASCII)) sizeof renvoie-t-il la taille d'un type de données en octets ou en octets?Est-ce que sizeof renvoie le nombre d'octets ou le nombre d'octets d'un type dans C?

+3

Octets, mais un seul octet (représenté par 'char') a des bits' CHAR_BITS'. Si vous voulez le nombre d'octets dans un 'T', faites' sizeof (T) * CHAR_BITS/8'. Sur la plupart des plates-formes, 'CHAR_BITS' est' 8'. – GManNickG

+2

@GManNickG 'CHAR_BIT' (il n'y a pas de S) :) – Praetorian

+0

float octetPercent = sizeof (T) * CHAR_BIT /8.0; – awiebe

Répondre

16

Réponse: sizeof retourne la taille du type dans octets.


Exemple: sizeof(char) est garantie à 100% être 1, mais cela ne veut pas dire que c'est un octet (8 bits).


prouvé par la norme:

en 6.5.3.4, point 2:

L'opérateur sizeof cède la taille (en octets) de son opérande, qui peut être un expression ou le nom entre parenthèses d'un type. La taille est déterminée à partir du type de l'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 .

...

Appliqué à un opérande qui est de type char, unsigned char ou char signé, (ou une version quali fi ée de celle-ci), le résultat est 1. Appliqué à un opérande de type tableau , le résultat est le nombre total d'octets dans le tableau. Lorsqu'il est appliqué à un opérande de structure ou de type union, le résultat est le nombre total d'octets dans un tel objet, y compris le rembourrage interne et arrière.

En outre, dans la section 3.6, point 3:

Un octet est composé d'une séquence contiguë de bits, dont le nombre est défini par l'implémentation-

+0

Très complet, merci. – awiebe

4

sizeof retourne toujours la taille 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é en nombre d'octets nécessaires pour représenter le type. Un octet dans ce contexte est le même qu'un caractère non signé, et peut être plus grand que 8 bits, bien que ce soit peu commun.

6

sizeof donne la taille en octets.Cependant, notez que "byte" est un terme technique dans la norme C, et est défini tel que sizeof(char) == 1.

1

De ma propre expérience, travaillant sur les contrôleurs de micro intégrés avec exotiques compilateurs 'C', j'ai vu:

sizeof(uint8) 

retour 1

sizeof(uint16) 

retour 1

sizeof(uint32) 

retour 2

Clairement, j'avais affaire à une machine dont la plus petite entité adressable était en 16 bits, donc le sizeof n'est pas conforme à C89 ou C99.

Je dirais que sur les systèmes conformes à la norme C89 & C99, la réponse acceptée est correcte. Malheureusement, un compilateur "C" peut encore être appelé un compilateur "C", même s'il n'est pas conforme à une norme de 25 ans. J'espère que cette réponse aidera à mettre les choses en perspective, compte tenu des systèmes plus exotiques.

Questions connexes