我是靠谱客的博主 要减肥薯片,最近开发中收集的这篇文章主要介绍C/C++位域结构体作用格式规则尺寸计算(x86下)使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

C/C++位域结构体

  • 作用
  • 格式
  • 规则
  • 尺寸计算(x86下)
  • 使用

作用

某些信息的存储表示只需要几个bit位就可以表示,
为了节省存储空间,位域就出现了。

格式

struct 位域结构名 
{
 位域列表1;
 位域列表2;
 ...
};
位域列表的形式为:
	类型说明符 位域名:位域长度;
	(无位域名,表示仅占位)

如:

struct {
	char c1 : 3;
	char c2 : 2;
	char c3 : 2;
}s1;
//sizeof=1

规则

一个位域必须存储在同一个字节中,不能跨两个字节

尺寸计算(x86下)

struct {
	char c1 : 3;
	char c2 : 2;
	char c3 : 2;
}s1;
//sizeof=1
说明:char 占一个字节共8位,3+2+2=7;故sizeof(s1)=1。
struct {
	char c1 : 3;
	char c2 : 3;
	char c3 : 3;
}s2;
//sizeof=2
说明:char 占一个字节共8位,3+2+3>8;故sizeof(s2)=2。
struct {
	int a : 2;
	int b : 4;
	char c;
}s3;
//sizeof=8
说明:int 占四个字节共32位,2+4<32;故a,b占四个字节,c占一个字节,
结构体字节对齐(按四个字节对齐),故sizeof(s3)=8。

即:
1、若相同类型的位域长度之和小于或等于类型的位数,则取单个该类型的字节数。
2、若相同类型的位域长度之和大于类型的位数,则取多个该类型的字节数之和。
3、不同类型,为各个类型字节数之和。
4、考虑结构体内存对齐

使用

#include <iostream>

struct Test
{
	int a : 5;
	int b : 3;
};

int main(void)
{
	char str[64] = "hello world";
	struct Test obj;
	
	memcpy(&obj, str, sizeof(Test));

	std::cout << obj.a << std::endl;	//8
	std::cout << obj.b << std::endl;	//3

	return 0;
}

说明:obj低8位对应’h’,其ASCII为0x68,对应二进制0110 1000;
obj.a占0 1000为8;obj.b占011为3

最后

以上就是要减肥薯片为你收集整理的C/C++位域结构体作用格式规则尺寸计算(x86下)使用的全部内容,希望文章能够帮你解决C/C++位域结构体作用格式规则尺寸计算(x86下)使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部