2009-02-25 23 views
7

Estoy usando bitfields para obtener acceso fácil en una biblioteca flotante que estoy tratando de hacer para un microcontrolador sin FPU.¿Cuál es la forma correcta de usar bitfields en C?

El problema es que parece que no puedo hacerlo funcionar con bitfields. Echar un vistazo:

typedef struct 
{ 
    union{ 
    unsigned long mantissa: 23; 
    unsigned long exponent: 8; 
    unsigned long sign: 1; 
    float all; 

     }; 

}_float __attribute__((__packed__)); 

El problema es que cuando intento acceder o cambiar algo que considera los campos de bits como bits de 1,8,23 desde el final, respectivamente. Mientras que debería ser de 23 bits desde el final, luego 8 bits y luego el último bit. A menos que haya entendido mal el uso de bitfields. Pensé que el uso de lleno resolvería el problema, pero como puede ver, no lo hizo.

Cualquier ayuda sería muy apreciada. He sido guiado a este sitio mientras busco en Google más de una vez, así que tengo muchas esperanzas.

+1

La forma correcta de usar bitfields es no usar bitfields. –

Respuesta

17

Es posible que le falte una estructura dentro de su sindicato.

typedef struct 
{ 
    union{ 
     struct { 
      unsigned long mantissa: 23; 
      unsigned long exponent: 8; 
      unsigned long sign: 1; 
     } float_parts; 
     float all; 
    }; 
}_float __attribute__((__packed__)); 

Tenga en cuenta que el orden de mantisa/exponente y signo depende de la endiabilidad de la CPU.

+0

Gracias por su aporte, pero ¿por qué agregar una estructura dentro de la unión? Realicé la unión de las partes del flotador con el flotador para asegurarme de que cada campo de bits corresponde a la parte adecuada del flotador. ¿No es suficiente? –

+1

una unión hará que TODOS sus miembros compartan la misma memoria. No creo que el uso de bitfields cambie este comportamiento, por lo que todos sus bitfields comienzan en el bit 0, tal como lo hace el flotador "all". Poniéndolos en una estructura hace que se distribuyan secuencialmente. – rmeador

+0

¡Tenías toda la razón! Eso es lo que se necesitaba. Culpo a mi comprensión de la unión, entonces :). Gracias amigo, ahora puedo acceder a cualquier parte de mi carroza a voluntad. –

0

El problema es que es una unión. Debería ser 'struct'.

0

Si está en una plataforma glibc puede echar un vistazo en el archivo de encabezado ieee754.h. Se ocupa de las cosas endianess. Si no, todavía vale la pena echarle un vistazo.

Cuestiones relacionadas