union里面的位域和struct里面的位域不等价吗
谁能解释下,为什么将bitfield_in_struct_t中的位域赋值给bitfield_in_union_t中的位域,输出的结果不一样呢?
[code=C]
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef union bitfield_in_union_st {
uint32_t idx:24,
data0:1,
data1:1,
data2:1,
data3:5;
} bitfield_in_union_t;
typedef struct bitfield_in_struct_st {
uint32_t idx:24,
data0:1,
data1:1,
data2:1,
data3:5;
} bitfield_in_struct_t;
int main(int argc, char *argv[])
{
bitfield_in_union_t dst;
bitfield_in_struct_t src;
src.idx = 0;
src.data0 = 1;
src.data1 = 0;
src.data2 = 1;
src.data3 = 2;
dst.idx = src.idx;
dst.data0 = src.data0;
dst.data1 = src.data1;
dst.data2 = src.data2;
dst.data3 = src.data3;
printf( "src> %d(%d,%d,%d,%d)\n ", src.idx, src.data0, src.data1, src.data2, src.data3);
printf( "dst> %d(%d,%d,%d,%d)\n ", dst.idx, dst.data0, dst.data1, dst.data2, dst.data3);
return 0;
}
[/code]
程序的输出为
src> 0(1,0,1,2)
dst> 2(0,0,0,2)
[解决办法]
查看反汇编就知道了。其实union只对那低24位进行了位赋值。
[解决办法]
union 中最后data3将idx空间重写了,只剩下000|00010
所以输出2
而struct中分开有独立空间,所以能区分不同data值
lz查看一下内存分布就可以看出来