type fields array c sizeof bit-fields

fields - ¿Hay un bit equivalente de sizeof() en C?



sizeof implementation (2)

Es imposible encontrar un tamaño de campo de bits usando sizeof (). Consulte C99:

  • 6.5.3.4 The sizeof operator , campo de bits claramente no es compatible con sizeof ()
  • 6.7.2.1 Structure and union specifiers aquí se aclara que el campo de bits no es un miembro autónomo.

De lo contrario, puede intentar asignar al miembro de campo de bits -1u (valor con todos los bits establecidos) y luego encontrar el índice del bit más significativo. Por ejemplo (sin probar):

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

man ffs para más

Sizeof () no funciona cuando se aplica a campos de bits:

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

... obviamente, ya que no puede devolver un tamaño parcial de punto flotante o algo así. Sin embargo, surgió una pregunta interesante. ¿ Hay un equivalente, en C, que le dirá el número de bits en una variable / tipo? Idealmente, también funcionaría para tipos regulares, como char y int , además de campos de bits.

Actualizar:

Si no hay un lenguaje equivalente a sizeof () para los campos de bits, ¿cuál es la forma más eficiente de calcularlo - en tiempo de ejecución? Imagine que tiene bucles que dependen de esto, y no quiere que se rompan si cambia el tamaño del campo de bits, y no hace trampas justas y hace que el tamaño del campo de bits y la longitud del bucle sean una macro. ;-)


No puede determinar el tamaño de los campos de bits en C. Sin embargo, puede averiguar el tamaño en bits de otros tipos utilizando el valor de CHAR_BIT , que se encuentra en limits.h. El tamaño en bits es simplemente CHAR_BIT * sizeof (type).

No asuma que un byte C es un octeto, es al menos 8 bits. Hay máquinas reales con 16 o incluso 32 bits de bytes.

Con respecto a su edición: yo diría que un campo de bits int a: n; Tiene un tamaño de n bits por definición. Los bits de relleno adicionales cuando se ponen en una estructura pertenecen a la estructura y no al campo de bits.

Mi consejo: No utilice campos de bits, sino que utilice (matrices de) caracteres unsigned char y trabaje con máscaras de bits. De esa manera, una gran cantidad de comportamiento (desbordamiento, sin relleno) está bien definido.