比特字段操作缺点

时间:2011-09-12 10:44:20

标签: c

我正在阅读此链接

http://dec.bournemouth.ac.uk/staff/awatson/micro/articles/9907feat2.htm

我无法理解链接中的以下声明,请帮助我理解这一点。

  

程序员只是写了一些移动或掩盖的宏   适当的位来获得所需的东西。但是,如果数据涉及   更长的二进制编码记录,C API遇到了问题。我有,   多年来,看到了许多冗长,复杂的二进制记录   使用短整数或长整数位字段定义工具。 C   将这些位字段限制为整数定义变量的子字段,   这意味着两个限制:首先,位字段可能是否定的   比基础变量更宽的位数;其次,没有   位字段应与基础变量边界重叠。复杂   记录通常由几个连续的长整数组成   填充了位子字段定义。

     

符合ANSI标准的编译器可以自由地强加这些大小和对齐   限制和指定,依赖于实现但是   可预测的方式,如何将位字段打包到底层机器中   字结构。结构内存对齐通常不可移植,但是   比特场内存甚至更少。

我从这些陈述中理解的是,宏可用于将位掩码为左移或右移。但我心里怀疑为什么他们会使用宏? - 我认为通过在宏中定义它可以建立可移植性而不管16位或32位操作系统。这是真的吗?我无法理解上述声明中提到的两个缺点.1 .bit字段可能不会更宽2.无位域应与基础变量边界重叠

和行,

  

复杂记录通常由几个连续的长整数组成   填充了位子字段定义。

1 个答案:

答案 0 :(得分:4)

1.bit字段可能不宽

假设你想要一个200位长的位域。

struct my_struct {
  int my_field:200;  /* Illegal! No integer type has 200 bits --> compile error!
} v;

2.无比特字段应与基础变量边界重叠

假设您需要两个30位的位域,并且编译器使用32位整数作为基础变量。

struct my_struct {
  unsigned int my_field1:30;  
  unsigned int my_field2:30; /* Without padding this field will overlap a 32-bit boundary */
} v;

通常,编译器会自动添加填充,生成具有以下布局的结构:

struct my_struct {
  unsigned int my_field1:30;  
  :2  /* padding added by the compiler */
  unsigned int my_field2:30; /* Without padding this field will overlap a 32-bit boundary */
  :2  /* padding added by the compiler */
} v;