【发布时间】:2015-12-05 17:47:02
【问题描述】:
我最近在玩 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的位> 意思是,等等)。
谢谢!
【问题讨论】:
-
00100001, with the MSB in the first place and the LSB in the last place我无法理解这句话,因为您的first和last非常模棱两可。你能更详细地解释你的期望吗?顺便说一句,注意你的打印顺序,你先打印a,这会产生第一个1。也许你误会了。 -
顺便说一句,由于您的示例使用
char和 8 位长的位字段组合,它确实与字节序无关。在结构中,a代表最低位,这是正确的。再次,可能您对打印有误解。 -
好吧,
first和last我指的是输出中以从左到右的阅读顺序显示的位。我很清楚,例如b->a首先打印并输出1。这是我问题的核心(@andrew-henle 已经回答了)。
标签: c struct bit-manipulation bit-fields