Pourquoi peu endianness est un problème dans bitfields?

Tout code portable qui utilise bitfields semble distinguer entre little et big-endian plates-formes. Voir la déclaration de struct iphdr dans le noyau linux pour un exemple d'un tel code. Je n'arrive pas à comprendre pourquoi peu endianness est tout un problème.

Comme je le comprends, bitfields sont purement compilateur construit, utilisé pour faciliter niveau de bits de manipulations.

Par exemple, considérez les points suivants champ de bits:

struct ParsedInt {
    unsigned int f1:1;
    unsigned int f2:3;
    unsigned int f3:4;
};
uint8_t i;
struct ParsedInt *d = &i;

Ici, l'écriture d->f2 est tout simplement un compact et lisible façon de dire (i>>1) & (1<<4 - 1).

Toutefois, les opérations sur les bits sont bien définis et de travail, indépendamment de l'architecture. Alors, comment se fait-bitfields ne sont pas portables?

  • Aussi longtemps que vous le lire et à écrire les bits il n'y a pas de problème. Le problème est d'une autre machine à écrire les bits ou de leur position d'être prescrite dans une norme de la propriété intellectuelle. La norme n'est pas encore fixe la taille d'un octet. Les chances que vous allez vraiment vous avez un problème n'est pas insurmontable.
  • Votre hypothèse que d->f2 est la même chose que (i>>1)&(1<<4 - 1) est faux. Il est complètement compilateur-dépendante. Voir les réponses ci-dessous.
InformationsquelleAutor Leonid99 | 2011-05-18