首页 > 其他分享 >位段的介绍与使用

位段的介绍与使用

时间:2024-01-08 18:01:38浏览次数:23  
标签:char 16 int 介绍 位段 使用 bit 从右

1.0位段介绍:

  • 位段  位--二进制位
  • 位段的声明与结构是类似的,但是有两个不同:位段的成员必须是:int 、unsigned int、signed int ;位段成员名后面必须有一个冒号和一个数字。
  • 位段作用:可以很大程度上节省空间

计算位段所占用的空间:

struct S
{
  int a:2;
  int b:5;
  int c:10;
  int d:30;
};
#include<stdio.h>
int main()
{
  struct S s;
  printf("%d\n",sizeof(s));
}

经运算之后得出该结果为:8

但是为什么结果是8呢??

我们要明白位段成员名冒号后面的数字代表的是:位(bit)  一共47bit--6个字节*8=48个bit

但是为什么结果是8而不是6呢??

这就涉及到位段内存分配和空间开辟的问题了  

//举个例子
struct S
{
  char a:3;
  char b:4;
  char c:5;
  char d:4;
};
int main()
{
  struct S s={0};
  s.a=10;
  s.b=12;
  s.c=3;
  s.d=4;
  printf("%d ",sizeof(s));
}

空间开辟如下:

位段的介绍与使用_位段

解释:

  • 首先char类型占一个字节,所以机器会先开辟8个位的空间,从右向左依次占取,a和b一共占7个bit位,所以还多出来一个位。
  • c占五个bit,所以上个多出的一个bit会被丢弃,重新再开辟出一个字节,从右向左依次占用,d占4个bit位,所以又要开辟第三个字节,从右向左依次占用。
  • 将10,12,3,4四个数转换成为二进制然后依次放进自己开辟的bit位中。比如:10-->1010 但是a只占3个字节所以从右向左一次放进去,最左边的1会被舍弃。
  • 最后:内存在机器中是以16进制的形式存放的,四个二进制位表示一个16进制,从左向右每四个代表一个16进制位,依次是62 03 04

2.0位段的应用

位段的介绍与使用_16进制_02

3.0位段的跨平台问题

  1. int 位段被当成有符号数还是无符号数是不确定的。
  2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机 器会出问题。)
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是 舍弃剩余的位还是利用,这是不确定的。













































































标签:char,16,int,介绍,位段,使用,bit,从右
From: https://blog.51cto.com/u_16351083/9148272

相关文章

  • 6个在React中使用的小技巧
    这是一个可怕的问题,在React中,我们经常会编写条件语句来显示不同的视图,比如这个简单的例子。constApp=()=>{return(<>{loading?<Loading/>:<List>}</>)}但是,当项目的代码量足够大并且有很多JSX条件时,事情很快就会失控。代码......
  • 使用 Jamf Pro 和 Okta 工作流程实现自动化苹果设备管理
    Jamf的销售工程师VincentBonnin与Okta的产品经理EmilyWendell一起介绍了JNUC2021的操作方法会议。它们涵盖了Okta工作流程(OktaWorkflow),并在其中集成了JamfPro,构建了一些工作流程,并提供了几个用例。Okta工作流程和JamfPro这个使用OktaWorkflows和JamfPro进行苹果设备管理的J......
  • 使用VBScript清理%AppData%\Microsoft\InputMethod\Chs下的UDP*.tmp文件
    目录代码使用方法话题来源彩蛋——Windows操作系统下到底有多少种脚本语言?代码'VBScripttolistUDP*.tmpfilesandaskuserfordeletionOptionExplicit'DeclarevariablesDimWSHShell,FSO,TargetFolder,FileCollection,FileDimTargetPattern,FilesToDelete,Fi......
  • LINE网页版使用方法(内含LINE网页版特点总结)
    如果想要在电脑上使用LINE,但是又觉得下载客户端很累赘的话,LINE网页版是你最好的选择。但是LINE网页版相对于其他平台来说使用方式比较少。所以今天就来讲讲,我们有什么方式可以在电脑中使用LINE。LINE网页版使用方法1.需要使用Chrome浏览器,并选择【扩展程序】中的【访问Chrome应用商......
  • stm32学习总结:5、Proteus8+STM32CubeMX+MDK仿真串口并使用串口打印日志(注意重定向prin
    stm32学习总结:5、Proteus8+STM32CubeMX+MDK仿真串口并使用串口打印日志(注意重定向printf到串口打印的问题)文章目录stm32学习总结:5、Proteus8+STM32CubeMX+MDK仿真串口并使用串口打印日志(注意重定向printf到串口打印的问题)一、前言二、资料收集三、注意事项四、STM32CubeMX配置五、......
  • 日志:已知某天是星期几,不使用时间函数计算一个日期是星期几
    背景:2003年记录的小程序已知某天是星期几,不使用时间函数计算一个日期是星期几。不知道谁写的函数,有些复杂了,但运行正常。觉得先计算已知日期当年1月1号是星期几,再加上间隔年份+闰年数+所求日期是一年中的第几天比较简单。代码#include<iostream>#include<conio.h>usingnamesp......
  • 使用anaconda创建爬虫spyder工程
    1.由于每个工程使用的环境都可能不一样,因此一个好的习惯就是不同的工程都创建属于自己的环境,在anaconda中默认的环境是base,我们现在来创建一个名为spyder的环境,专门用于爬虫工程://括号中名字,代表当前的环境(base)dragon@machine:$condacreate--name=spyder2.激活环境//环境从......
  • 使用anaconda创建notebook工程
    1.由于每个工程使用的环境都可能不一样,因此一个好的习惯就是不同的工程都创建属于自己的环境,在anaconda中默认的环境是base://括号中名字,代表当前的环境(base)dragon@machine:$condacreate--name=example2.激活环境//环境从base切换到example(base)dragon@machine:$condaa......
  • 「微服务」Saga 模式 如何使用微服务实现业务事务-第二部分
    在上一篇文章中,我们看到了实现分布式事务的一些挑战,以及如何使用Event/Choreography方法实现Saga的模式。在本文中,我们将讨论如何通过使用另一种类型的Saga实现(称为Command或Orchestration)来解决一些问题,如复杂事务或事件的循环依赖性。Saga的命令/编曲序列逻辑在编曲方法中,我们......
  • 【MLOps】使用Ray缩放AI
    Ray正在人工智能工程领域崭露头角,对扩展LLM和RL至关重要Spark在数据工程中几乎是必不可少的。Ray正在人工智能工程领域崭露头角。雷是伦敦大学学院Spark的继任者。Spark和Ray有很多相似之处,例如用于计算的统一引擎。但Spark主要专注于大规模数据分析,而Ray则是为机器学习应用程序设......