当前位置: 首页 > news >正文

【C语言位段】C语言位段的特点和应用

将几个 位段变量拼接放入一个16位中,为简便,我让每个字段的值等于它的位段长度。

struct PUD
{
  unsigned int version :4;       //协议版本,version 占用4bit
  unsigned int Vendor_Code :4;   //厂商代码,占用4bit
  unsigned int frame_type:5;     //帧类型, 占用5bit
  unsigned int data_len:11;      //信息段长度, 占用11bit
  unsigned int crane_type:4;     //塔吊类型, 占用4bit
  unsigned int multi_pw:4;       //倍率, 占用4bit
  unsigned int Prot_Type :1;     //保护类型, 占用1bit
  unsigned int Prot_reserved :3; //保留字段,占用3bit
  unsigned int Prot_e_num:4;     //保护区元素个数, 占用4bit
  unsigned int op_mark:1;        //操作标志, 占用1bit
  unsigned int op_reserved :2;   //保留字段, 占用2bit
  unsigned int  incident :3;     //本次事件, 占用3bit
};

struct PUD packet_data;


  int test2;
  packet_data.crane_type=4;   

  packet_data.multi_pw=4;      
  packet_data.Prot_Type=1;    
  packet_data.Prot_reserved=3;
  packet_data.Prot_e_num=4;
  test2=0x00;     //清零

  //从低位填充
  test2=test2|packet_data.Prot_e_num;
  test2=test2|packet_data.Prot_reserved<<4;
  test2=test2|packet_data.Prot_Type<<7;
  test2=test2|packet_data.multi_pw<<8;
  test2=test2|packet_data.Prot_num<<12;

 test2=test2;//test2赋值后没有调用,为了在IAR编译器给test2分配空间,能看到test2的值,加了这一句。
结果:

【C语言位段】C语言位段的特点和应用

#include <stdio.h>typedef struct _A{unsigned a:4;//位段成员的类型仅能够为unsigned或者intunsigned b:4;unsigned c:2;unsigned d:6;unsigned E:1;unsigned D:2;unsigned T:3;unsigned A:9;unsigned h:4; //前面已经为31,故4+31>32已超过一个存储单元,所以4在一个新的存储单元存放unsigned y:29;//由于前面的4在一个新的存储单元的开头存放,且29+4>32, 故在另一个新的存储单元存放}A;              //所以最后求出的A的大小是4 + 4 + 4 =12typedef struct _S{unsigned a:4;unsigned b:4;unsigned c:22;unsigned q:1;unsigned h:1;//unsigned i:33;  // 错误:‘i’ 的宽度超过它自身的类型//unsigned i:1;当多出此行时,该结构体大小由4变为8,因为此行之前正好为32位} S;typedef struct _T{      //当没有占满一个存储单元时,结构体的大小对齐为一个存储单元的大小unsigned a:2;unsigned b:2;unsigned j:1;unsigned : 1;//可以定义无名位段,此例中该无名位段占用1位的空间,该空间将不被使用} T;typedef struct _V{unsigned a:1;unsigned b:4;unsigned :0;   //定义长度为0的位段时不能指定名字,否则编译不过unsigned d:1;  //定义了0字段后,紧接着的下一个成员从下一个存储单元开始存放;}V;                                    //此例子中,d前面那个存储单元中的余下的27位中被0填充了int main(){A a; S s; T t; V v;

相关文章:

  • 【GPRS发送控制符】SIM908/508 GPRS发送数据中的控制符
  • 【charconst* char】char **const p const char **p char *const *p
  • 【static、extern、头文件】static、extern、头文件的一点总结
  • 【strstr()函数的局限】strstr()检测不到存在的字符/数据/strcmp, strncmp和memcmp
  • 【ZIGBEE资料】zigbee资料下载
  • 【指针有效性】指针有效性的有效性检测的必要性!!
  • 【GPRS透明传输】GPRS透明传输
  • 【GPRS拨号错误】GPRS 某条指令一直ERRO
  • 【IAR编译和单片机】IAR编译和单片机的一些积累
  • 【C++】C++获取系统日期时间
  • 【单片机重启】MSP430重启/频繁重启/跑飞 原因分析
  • 【堆和栈的区别】堆heap 和栈stack有什么区别(代码区、常量区、静态区(全局区)、堆区、栈区)...
  • 【MODBUS】 协议
  • 【单机片调试】开发调试MSP430 遇到的问题总结
  • 【单片机程序和RAM】程序在RAM中调试的运行方式程序固化后运行方式
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • css属性的继承、初识值、计算值、当前值、应用值
  • Docker入门(二) - Dockerfile
  • Java面向对象及其三大特征
  • Mysql5.6主从复制
  • Mysql数据库的条件查询语句
  • OSS Web直传 (文件图片)
  • Sass Day-01
  • spring + angular 实现导出excel
  • Spring声明式事务管理之一:五大属性分析
  • storm drpc实例
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Terraform入门 - 3. 变更基础设施
  • Twitter赢在开放,三年创造奇迹
  • Unix命令
  • vue2.0项目引入element-ui
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 学习笔记:对象,原型和继承(1)
  • 《天龙八部3D》Unity技术方案揭秘
  • Prometheus VS InfluxDB
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​Python 3 新特性:类型注解
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $.each()与$(selector).each()
  • $.proxy和$.extend
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (独孤九剑)--文件系统
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (转)创业的注意事项
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat文件调用java类的main方法
  • .java 9 找不到符号_java找不到符号
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?