从低到高的位顺序/C 中带有位域的映射结构
Bit order from low to high / Mapping structs with bitfields in C
我最近在玩 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)。
有人可以解释这种行为吗?
此外,我可以假设映射将始终朝这个方向吗?
注:我不是问字节序,是关于byte顺序.我的问题的背景是我试图将缓冲区映射到结构。缓冲区包含一个 UDP 消息,由 "bit mapping" 组成(即“位置 x 的位意味着这个,位置 y 的位到z就是那个意思,依此类推)。
谢谢!
根据 C standard 的 6.7.2.1:
The order of allocation of bit-fields within a unit (high-order to
low-order or low-order to high-order) is implementation-defined.
未定义位字段的内存布局,因此它依赖于编译器。你可以通过enter link description here
我相信您的困惑在于您呈现结果的方式。您希望它像普通数字一样以右侧的 LSB 打印,但您的代码打印了一串位,从左侧的 LSB 开始并向右打印。
您的结果显示位 a
符合预期的最低(第一个,最不重要的)内存位。
我最近在玩 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)。
有人可以解释这种行为吗?
此外,我可以假设映射将始终朝这个方向吗?
注:我不是问字节序,是关于byte顺序.我的问题的背景是我试图将缓冲区映射到结构。缓冲区包含一个 UDP 消息,由 "bit mapping" 组成(即“位置 x 的位意味着这个,位置 y 的位到z就是那个意思,依此类推)。
谢谢!
根据 C standard 的 6.7.2.1:
The order of allocation of bit-fields within a unit (high-order to low-order or low-order to high-order) is implementation-defined.
未定义位字段的内存布局,因此它依赖于编译器。你可以通过enter link description here
我相信您的困惑在于您呈现结果的方式。您希望它像普通数字一样以右侧的 LSB 打印,但您的代码打印了一串位,从左侧的 LSB 开始并向右打印。
您的结果显示位 a
符合预期的最低(第一个,最不重要的)内存位。