c结构体之位域

一、 结构体之位域

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值