位段的数据结构- 数据排列和打印

位段


位段定义,赋值,输出,占用的问题说明

遇到位段相关的问题,这里记录下来:

typedef struct A
{
    int a:5;
    int b:3;
}NEWSTRU;


int _tmain(int argc, _TCHAR* argv[])
{   
    char x[100] = "0123456789";
    NEWSTRU te;
    memcpy(&te, x, sizeof(NEWSTRU));
    printf("value is A-HEX:%X, A-DEC:%d B-HEX:%X,B-DEC:%d te-(int) %X\n",te.a, te.a,te.b,te.b, *((int *)&te));
    return 0;
}

打印结果如下:

value is A-HEX:FFFFFFF0, A-DEC:-16 B-HEX:1,B-DEC:1 te-(int) 33323130

最初对结果非常不解,下面是解释:\


1.在使用HEX输出时,如果最高位为1,则将被认成负值,剩余高位用1填充
  此时,如果以%d输出的话,则取补码(取反+1)然后前面加个负号
  如果以%X输出的话,则高位填充1,然后直接打印出来

举例:
以下struct A为例,
{
    int a:5;
    int b:3;
}
被拷贝值 0x30
则打印 a = -16或者 0xfffffff0
             b = 1



另,位段只能以int, unsigned int, signed int 来定义,且定义的位段大小不可以超过sizeof(int)
连续几个位段变量,如果大小之和都在sizeof(int)内的话,将挤在一起
但是如果当下一个位段变量挤不下的话,将抛弃上面的空间,从新开始


举例:

这里 int为32位

struct A
{
    int a:31;
    int b:3;
}
则b将另起计算空间,而不使用a剩下的1bit

struct A
{
    int a:4;
    int b:4;
}

则ab将挤在一起,假设struct A = 0x000102CD

则a = 0x0D

    b = 0x0C



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值