首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

union里面的位域和struct里面的位域不等价吗,该如何解决

2012-03-31 
union里面的位域和struct里面的位域不等价吗谁能解释下,为什么将bitfield_in_struct_t中的位域赋值给bitfi

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查看一下内存分布就可以看出来

热点排行