这好像是一个公司的笔试题,网上很多解析的,我也做过。。。。
详细内容移步:[c&cpp][memory] 内存对齐分配策略(含位域模式)
typedef struct bitstruct {
int b1:5;
int b2:2;
int b3:3;
}bitstruct;
int _tmain(int argc, _TCHAR* argv[]) {
bitstruct b;
memcpy(&b,"EM",sizeof(b));
cout<<sizeof(b)<<endl;
cout<<b.b1<<endl<<b.b2<<endl<<b.b3;
return 0;
}
对于bitstruct是含有位域的结构体,sizeof(int)为4字节,按照规则1、2,首先b1占起始的5个字节, 根据含位域规则1, b2紧跟存放,b3也是紧跟存放的。
根据规则5,得到sizeof(bitstruct) = 4。
现在主流的CPU,intel系列的是采用的little endian的格式存放数据,motorola系列的CPU采用的是big endian.
以主流的little endian分析:
在进行内存分配的时候,首先分配bitstruct的第一个成员类型int(4字节),这四个字节的存放按照低字节存储在低地址中的原则。
int共4个字节:
第4个字节 - 第3个字节 - 第2个字节 - 第1个字节,
在内存中的存放方式如下所示。
而后为b1分配5位,这里优先分配的应该是低5位,也就是第一个字节的低5位。
继而分配b2的2个字节,也就是第1个字节中紧接着的2位。
最后分配b3的3位,按照规则1、2,b3还是紧接着存放的,b3的最低位是第一个字节的最高位,高两位为第2个字节的低两位。
内存分配图如下所示:
字符E二进制为0100 0101,字符M的二进制为0100 1101,在内存中存放如下所示:
memcpy为按位拷贝的,所以两片内存区可以直接对应上,得到
b1的二进制形式为:00101 ,高位为0,正数,5
b2的二进制形式为:10 ,高位为1,负数,取反加1,添加符号,-2
b3的二进制形式为:b3的最低一位是0,高位为01,拼接后为010,正数,2
内存分配情况感觉蛮奇怪的,按如下修改例7,b1应该为5,b2为-2,b3为-6,VC8.0下验证正确。
typedef struct bitstruct {
int b1:5;
int b2:2;
int b3:4;
}bitstruct;
int _tmain(int argc, _TCHAR* argv[]) {
bitstruct b;
memcpy(&b,"EM",sizeof(b));
cout<<sizeof(b)<<endl;
cout<<b.b1<<endl<<b.b2<<endl<<b.b3;
return 0;
}
谢谢~~