标签:配置 img 出现 sign 操作 枚举 长度 域名 最好
[TOC]
? 今天再改代码时碰到一个位域使用问题,位域是指信息在存储时,并不需要一个完整的字节,而只需要占一个或几个二进制位。又称为”位段”。所谓“位域”是把一个字节或多个字节中的二进制位划分多个部分,并指定每个域的位数。每个域定义一个域名,之后就可以通过直接调用域名进行操作。定义一个位域类型如下:
struct bs{ int a:8; int b:2; int c:6;};
? 因为之前使用时是直接套过来的,没有了解具体的对齐方式,改动是也是一位一位往下使用的,没有出现对齐问题。这次由于要按对方设备的数据格式排列,所以在测试时出现了数值不对的现象。 去网上查到了使用和对齐规则如下:
所以找到出错原因为配置位域时未使用字节分配给一个域名的bit大于当前字节剩余的bit位数,导致该位域从新在新的存储单元中开始分配,出现数据错位(规则5)。更改方法为将未使用域名内容分成两份,一份用于补齐当前存储单元剩余的位数,剩下的定义为另一个域名。
问题2
? 该位域成员使用的枚举类型定义的,最开始发现问题时,怀疑是否枚举类型在使用位域存储方式会不太一样,所以将未使用的域名类型给定义为int型,发现数据正常,问题解决了!下图第一个时最开始的结构,第二个是补充适当位的结构,第三个是直接将无用位域改为int 测得3个数据结构的大小分别为5、4、4字节,所以第三个是符合规则6,进行了压缩, 另在三个结构里多分配一位得到的结构整体大小位8字节(12)
以上内容是在keil+c+Stm32下实现的。
标签:配置 img 出现 sign 操作 枚举 长度 域名 最好
原文地址:https://www.cnblogs.com/petewell/p/11445317.html