Битовый порядок от низкого до высокого / Структуры отображения с битовыми полями в C
Недавно я играл с битовыми полями в C, и, очевидно, биты упорядочены от низкого к высокому, хотя Google не поддерживает этот тезис (например, Википедия).
Возьмите следующий код ( http://ideone.com/UwWfJM):
#include <stdio.h>
struct bits {
unsigned char a : 1;
unsigned char b : 1;
unsigned char c : 1;
unsigned char d : 1;
unsigned char e : 1;
unsigned char f : 1;
unsigned char g : 1;
unsigned char h : 1;
};
int main(int argc, char **argv)
{
unsigned char c = 33;
struct bits *b = (struct bits *) &c;
printf("dec: %u\n", c);
printf("bits: %x", b->a);
printf("%x", b->b);
printf("%x", b->c);
printf("%x", b->d);
printf("%x", b->e);
printf("%x", b->f);
printf("%x", b->g);
printf("%x\n", b->h);
return 0;
}
Выход
dec: 33
bits: 10000100
... хотя я ожидал, что порядок размещения битов будет наоборот (то есть 00100001
с MSB на первом месте и LSB на последнем месте).
Может кто-нибудь объяснить это поведение?
Кроме того, могу ли я предположить, что отображение всегда будет в этом направлении?
Примечание: я не спрашиваю о порядке байтов, который касается порядка байтов. История моего вопроса в том, что я пытался отобразить буфер в структуру. Буфер содержал UDP-сообщение, состоящее из "битового отображения" (то есть "бит в позиции x означает это, биты в позиции от y до z означают это и т. Д.).
Спасибо!
3 ответа
Согласно 6.7.2.1 стандарта С:
Порядок распределения битовых полей внутри блока (от старшего к младшему или от младшего к старшему) определяется реализацией.
Я полагаю, что ваша путаница заключается в том, как вы представили результат. Вы ожидали, что он будет напечатан с LSB справа, как обычное число, но ваш код печатает строку битов, начиная с LSB слева и печатая справа.
Ваш результат показывает немного a
в младшем (первом, наименее значимом) бите памяти, как и ожидалось.
Расположение в памяти битовых полей не определено, поэтому зависит от компилятора. Вы можете перейти через описание ссылки здесь