您的位置:首页 > 理论基础 > 数据结构算法

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

2016-08-18 18:25 204 查看
位段

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

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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: