Любой переносимый код, который использует битовые поля, кажется, отличает мало- и big-endian платформы. См. объявление структуры iphdr в ядре linux для примера такого кода. Я не понимаю, почему bit endianness является проблемой вообще.
Насколько я понимаю, битовые поля - это просто конструкции компилятора, используемые для облегчения манипуляций с уровнем бит.
Например, рассмотрим следующее битовое поле:
struct ParsedInt {
unsigned int f1:1;
unsigned int f2:3;
unsigned int f3:4;
};
uint8_t i;
struct ParsedInt *d = &i;
Здесь запись d->f2
- это просто компактный и читаемый способ сказать (i>>1) & (1<<4 - 1)
.
Однако операции бит хорошо определены и работают независимо от архитектуры. Итак, как же битполы не переносятся?