从低到高的位顺序/在C

时间:2015-09-09 16:33:38

标签: c struct bit-manipulation bit-fields

我最近玩C中的位字段,显然,这些位从低到高排序,尽管Google不支持这一论点(例如Wikipedia。)

采用以下代码(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 意味着,等等。)

谢谢!

2 个答案:

答案 0 :(得分:5)

C standard的每个6.7.2.1:

  

单元内位域分配的顺序(高位到   低阶或低阶到高阶)是实现定义的。

答案 1 :(得分:1)

我相信你的困惑与你呈现结果的方式有关。您希望它与正常数字一样在右侧打印LSB,但您的代码会打印一串以左边的LSB开头并向右打印的位。

您的结果会在预期的最低(第一个,最低有效)内存位中显示位a