一、 结构体之位域
struct A
{
int a:4;
int b:3; //4
}; //4字节
struct B
{
int i: 8;
int j: 4; //i + j = 8字节
double b; //8字节
int a:3; // 8字节
}; 24字节
struct C
{
int i: 8;
int j: 4;
int a: 3; //i+j+a = 8
double b; // 8
}; 16字节
找到最大的数据类型,以此类型大小为内存对齐。一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始
如结构体B 最大为8字节,i,j 相加位值 12位小于8字节,可子继续添加下一个,但是下一个为double 却没有位大小默认为其数据类型的大小8字节 ,此时12位+8字节超过最大的内存对齐数,则这个double整个重起一个内存字节为8字节,i、j共占8字节(12位后保留没有使用但算其大小)此时已经有 8+8字节,再下一个数 a 有3位 之前8字节已填满,就再创另一个字节对齐空间8字节来存放。所以总共 8+ 8+8 = 24 字节
二、笔试题
位域结合的题目:
#include <iostream>
#include <memory.h>
using namespace std;
struct A
{
int a:5;
int b:3;
}; // 4个字节
int main(void)
{
char str[100] = "0134324324afsadfsdlfjlsdjfl";
struct A d;
memcpy(&d, str, sizeof(A));
cout << "sizeof(A):"<<sizeof(A) <<endl;
cout << "d.a:" <<d.a << endl;
cout << "d.b :" <<d.b << endl;
return 0;
}
结果:
分析:
①、sizeof(A) = 4 字节对齐为4字节,两个位域加起来满足
②、memcpy 将 “0134” 拷到d
d的内存分配:
高位 00110100 00110011 00110001 00110000 低位
'4' '3' '1' '0' 对应16进制值
其中d.a和d.b占用d低位一个字节(00110000),d.a : 10000, d.b : 001
d.a内存中二进制表示为10000,由于d.a为有符号的整型变量,输出时要对符号位进行扩展,所以结果为-16(二进制为11111111111111111111111111110000)补码
d.b内存中二进制表示为001,由于d.b为有符号的整型变量,输出时要对符号位进行扩展,所以结果为1(二进制为00000000000000000000000000000001)
转载:https://www.cnblogs.com/bigrabbit/archive/2012/09/20/2695543.html