首页 > 其他分享 >位段的讲解与计算

位段的讲解与计算

时间:2023-01-29 17:00:39浏览次数:35  
标签:char 字节 int 成员 位段 内存 计算 讲解

/*

什么是位段

位段的声明和结构体是类似的,但有两个不同之处:

1.位段的成员必须是int、unsigned int、signed int或char(属于整型家族)类型

2.位段的成员名后面有一个冒号和一个数字

举个例子:

struct A

{

 int _a:2;

 int _b:5;

 int _c:10;

 int _d:30;

};

1

2

3

4

5

6

7

这里的A就是一个位段类型。

那么位段类型中的成员的冒号后的数字代表什么意思呢?

其实冒号后面的数字代表该成员需要用的bit位的位数;所以该数字不能超过该成员的变量类型大小。

如下位段的错误定义:

struct B

{

  int _x:33;//error 因为int型大小为4字节即32个bit,33超过了32

  char _y:9;//error char型大小为1字节即8bit(同上)

}

1

2

3

4

5

知道了位段是是什么,那么如何计算位段的大小呢?是否就是将位段中的每个成员的大小相加?


位段的内存分配

1. 位段的成员可以是 int、unsigned int、signed int 或者是 char (属于整形家族)类型。

2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。

若成员为int型,则以4个字节的方式开辟,若成员为char型,则以1字节的方式开辟。

3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

struct S

{

 char a:3;

 char b:4;

 char c:5;

 char d:4;

};

struct S s = {0};

 s.a:10;

 s.b:12;

 s.c:3;

 s.d:4;

分配方式:

1.因为位段中的成员类型为char型,所以空间上是按照1个字节来开辟的,而位段 S 类型中第一个成员定义的大小为 3 bit, 在赋值时将 a 赋值为10,10的二进制序列为:01010 (后几位),受定义大小的限制,需舍弃一部分序列再存入内存中,所以最终存入内存中的序列为:010,且规定在分配的内存中是从后向前放入序列(如上图蓝色方框)。

2.当成员 a 放入内存中后,第一个字节还剩下5个bit位,而第二个成员占4个bit位,所以剩下的内存能够放下成员 b,放入方式同理,仍为从后向前放入(如上红色方框)。

3.当第一个字节放入成员 a 和 b 后,还剩下1个bit位,很显然不够第三个成员 c 放入,所以再次开辟1个字节的空间,然后再按照以上成员放入的方式依次放入,最终整个位段所占的内存就为3个字节大小。

结果如下:

int main()

{

 struct S s = {0};

 s.a:10;

 s.b:12;

 s.c:3;

 s.d:4;

 printf("%d\n",sizeof(s));//3

}

位段跨平台问题

int 位段被当成有符号数还是无符号数是不确定的。

位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。

位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。

当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

总结:

跟结构体相比,位段可以达到同样的效果,优点在于可以很好的节省空间,但是有跨平台的问题存在。

*/

标签:char,字节,int,成员,位段,内存,计算,讲解
From: https://blog.51cto.com/u_15916254/6025880

相关文章

  • 【KAWAKO】模型的压缩、扩张,计算模型的各种成本
    目录模型压缩量化稀疏化训练剪枝知识蒸馏自蒸馏集成使用精细化模型结构模型扩张深度宽度输入图像的分辨率深度、宽度、分辨率联合扩张使用精细化模型结构计算模型的各种成......
  • 操作系统 - 计算机组成原理
    冯诺依曼模型CPU每次可以计算4个byte-32位CPU;每次可以计算8个byte-64位CPU;32和64称为CPU的位宽。寄存器离CPU近的存储来存储需要被计算的数字PC寄存......
  • 计算机数据单位
    一.名称解释1、位(bit)来自英文bit,音译为“比特”,表示二进制位。位是计算机内部数据储存的最小单位,11010100是一个8位二进制数。一个二进制位只可以表示0和1两种状态(21);两个二......
  • 华为云发布冷启动加速解决方案:助力Serverless计算速度提升90%+
    摘要:本文介绍了华为云对冷启动优化这一业界难题的探索之路,创新提出了基于进程级快照的优化方案。作者信息——子游:华为元戎高级工程师平山:华为云中间件Serverless负责......
  • 基本计算器
    基本计算器给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。示例:输入:s="1+1"输出:2输入:s="2-1+2"输出:3输入:s="(1+(4+5+2)-3)+(6+8......
  • 计算机网络——媒体访问控制(MAC)
    媒体访问概述局域网是一种通信网络,通信网络由一定数量的设备互连而成,为网络中的两个相连设备提供它们之间的数据传输的途径。这些设备常被称为网络节点(Node),而在局域网技术......
  • 启科 QuTrunk+Runtime+QuSaaS+亚马逊云科技量子计算编程实战
    QuTrunk是启科量子自主研发的一款免费、开源、跨平台的量子计算编程框架,包括量子编程API、量子命令转译、量子计算后端接口等。它提供多种量子计算体验,提供本地量子计算......
  • 根据生日日期计算年龄
    functiongetAge(strAge){constbirArr=strAge.split("-");constbirYear=Number(birArr[0]);constbirMonth=Number(birArr[1]);......
  • 浏览器网络诊断显示远程计算机或设备将不接受连接
    表现情况为:微信可以登录,但是浏览器无法上网,在浏览器上运行Windows诊断显示远程计算机或设备将不接受连接解决办法:1、Win+r打开运行,输入inetcpl.cpl,点击确定。......
  • 什么是“云计算”、“云边协同”
    “云计算”的概念由Google在2006年首次提出,随着IT、CT技术的不断发展和融合,云计算开始快速发展并广泛被接受,但是关于边缘计算、云边端、云边协同的含义及相关联系是什么呢?......