Y a - t-il un bit équivalent de sizeof() en C?

Sizeof () ne fonctionne pas lorsqu'il est appliqué aux champs de bits:

# cat p.c
  #include<stdio.h>
  int main( int argc, char **argv )
  {
    struct { unsigned int bitfield : 3; } s;
    fprintf( stdout, "size=%dn", sizeof(s.bitfield) );
  }
# gcc p.c -o p
  p.c: In function ‘main’:
  p.c:5: error: ‘sizeof’ applied to a bit-field

...évidemment, puisqu'il ne peut pas retourner une taille partielle à virgule flottante ou quelque chose comme ça. Cependant, il a soulevé une question intéressante. y a-t-il un équivalent, en C, qui vous indiquera le nombre de bits dans une variable / type? Idéalement, cela fonctionnerait également pour les types réguliers, comme char et int , en plus des champs de bits.

Mise à jour:

S'il n'y a pas d'équivalent linguistique de sizeof () pour bitfields, Quel est le moyen le plus efficace de le calculer - à l'exécution! Imaginez que vous avez des boucles qui dépendent de cela, et vous ne voulez pas qu'elles se cassent si vous changez la taille du bitfield - et pas de tricherie juste et faire de la taille du bitfield et de la longueur de la boucle une macro. ;-)

22
demandé sur eruciform 2010-07-23 19:32:55

2 réponses

Vous ne pouvez pas déterminer la taille des champs de bits dans C. Vous pouvez cependant trouver la taille en bits d'autres types en utilisant la valeur de CHAR_BIT, trouvée dans limits.h. La taille en bits est simplement CHAR_BIT * sizeof (type).

Ne supposez pas que le C de l'octet un octet, c'est - , au moins 8 bits. Il existe des machines réelles avec 16 ou même 32 octets de bits.

Concernant votre édition: Je dirais qu'un champ de bits int a: n; a une taille de N bits par définition. Le rembourrage supplémentaire bits lorsqu'il est mis dans une structure appartiennent à la structure et non au champ de bits.

Mon conseil: N'utilisez pas de champs de bits mais utilisez (tableaux de) unsigned char et travaillez avec des masques de bits. De cette façon, beaucoup de comportement (débordement, pas de rembourrage) est bien définie.

18
répondu schot 2010-07-23 16:31:41

, Il est impossible de trouver une taille de bits en utilisant sizeof(). Référez-vous à C99:

  • 6.5.3.4 The sizeof operator, bits est clairement pas pris en charge par sizeof()
  • 6.7.2.1 Structure and union specifiers ici, il est précisé que bit-field n'est pas un membre autonome.

Sinon, vous pouvez essayer d'attribuer au bit-field member-1u (valeur avec tous les bits définis) et ensuite trouver l'index du bit le plus significatif. Par exemple (non testé):

s.bitfield = -1u;
num_bits = ffs(s.bitfield+1)-1;

man ffs pour plus d'.

3
répondu Dummy00001 2010-07-23 16:27:51