【发布时间】:2012-11-27 23:18:41
【问题描述】:
为什么有些结构有零宽度位域,为什么需要它?
struct foo {
int a:3;
int b:2;
int :0; // Force alignment to next boundary.
int c:4;
int d:3;
};
int main()
{
int i = 0xFFFF;
struct foo *f = (struct foo *)&i;
printf("a=%d\nb=%d\nc=%d\nd=%d\n", f->a, f->b, f->c, f->d);
return 0;
}
上面程序的输出是
manav@os-team:~/programs/test$ ./a.out
a=-1
b=-1
c=-8
d=0
请解释为什么这些值为负数,以及这些变量在结构内部的内存布局?
【问题讨论】:
-
这是微软的回答,我建议你看看:msdn.microsoft.com/en-us/library/ewwyfdbe(v=vs.71).aspx,即便如此,对齐总是依赖于编译器。
-
结构 { int a:3;诠释 b:2;整数:0;诠释 c:4;诠释d:3; };这将给出 000aaabb 0ccccddd 的布局,而不是没有 :0; 0000aaab bccccddd 0 宽度字段表示应在下一个原子实体 (char) 上设置以下位域。声明为位字段的数据的顺序是从低位到高位,或其他方式取决于您的架构。
-
在我的实验中,
d每次在 linux gcc7.2 中运行时都会得到不同的值。但是,在 windows mingw 5.3 下,输出将保持不变。所以它在很大程度上依赖于编译器。
标签: c struct bit-manipulation signed