Quelle est la bonne façon d’utiliser les champs de bits en C?

J’utilise des champs de bits pour obtenir un access facile à une bibliothèque flottante que j’essaie de créer pour un microcontrôleur sans FPU.

Le problème est que je n’arrive pas à le faire fonctionner avec les champs de bits. Regarde:

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

Le problème est que lorsque j’essaie d’accéder ou de modifier quelque chose, il considère les champs de bits comme étant respectivement 1,8,23 bits à partir de la fin. Alors qu’il devrait être 23 bits de la fin, puis 8 bits et puis le dernier bit. Sauf si j’ai totalement mal compris l’utilisation des champs de bits. Je pensais que l’utilisation de emballé résoudrait le problème, mais comme vous pouvez le constater, ce n’est pas le cas.

Toute aide sera grandement appréciée. J’ai été conduit sur ce site tout en cherchant sur Google plus d’une fois, donc j’ai de grands espoirs.

Il se peut que vous manquiez d’une structure à l’intérieur de votre syndicat.

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

Notez que l’ordre de mantisse / exposant et le signe dépendent de l’endianité du cpu.

Le problème est que c’est un syndicat. Ce devrait être ‘struct’.

Si vous êtes sur une plate-forme glibc, vous pouvez consulter le fichier d’en-tête ieee754.h. Il s’occupe des problèmes d’endianess. Sinon, il vaut probablement la peine de jeter un coup d’œil.