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.