这个应该是我理解的最透彻的一次啦

#include <stdio.h>

union _data
{
    struct _test
    {
         int i:1;
         int j:2;
         int k:13;
    }test;
    int n;
}data;


int main ()
{
    data.n = 0x1234;

    printf("%x\n", data.test.i);   //0
    printf("%x\n", data.test.j);   //fffffffe
    printf("%x\n", data.test.k);   //246

    printf("%d\n", sizeof(data));  //输出4,这个很容易理解

    return 0;
}

注:小端模式

data.n=0x1234语句之后,n在内存中的比特位信息如下:

(高地址)00000000  00000000 00010010 00110100(低地址)

上面的信息也就是test的信息,

int i:1表示test的最右边的一个比特位0

int j:2表示int i:1后面的两个比特位的信息10,1表示符号位,将其扩展为int后得到0xfffffffe

int k:13表示int j:2后面的13个比特位的信息00010010 00110,最左边的0表示符号位,将其扩展为int后得到0x00000246