位段
位段定义,赋值,输出,占用的问题说明
遇到位段相关的问题,这里记录下来:
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
最初对结果非常不解,下面是解释:\
此时,如果以%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位
{
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
位段详解与实践
本文详细解析了位段的定义、赋值、输出及内存占用等问题,并通过具体示例介绍了位段在C/C++编程中的应用技巧。文章还强调了位段只能用int类型及其变形来定义,并且讨论了位段在不同情况下如何占用内存。
1143

被折叠的 条评论
为什么被折叠?



