Битовый порядок от низкого до высокого / Структуры отображения с битовыми полями в 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 в младшем (первом, наименее значимом) бите памяти, как и ожидалось.

Расположение в памяти битовых полей не определено, поэтому зависит от компилятора. Вы можете перейти через описание ссылки здесь

Другие вопросы по тегам