【问题标题】:Bitfields in C programming languageC 编程语言中的位域
【发布时间】:2016-03-11 07:19:06
【问题描述】:

如何在C中访问整个结构成员。意思是我想获取结构中变量的所有数据。

struct data
{
char a:1;
char b:2;
char c:3;
char d:1;
} arr;

我可以使用 .操作员。但我需要访问该结构中的所有成员。请告诉我该怎么做。

【问题讨论】:

  • 首先,检查并理解严格的别名规则 stackoverflow.com/questions/98650/… 。然后,你可以看看unions。然后,试着让自己熟悉编译器中的结构成员对齐,可能还有术语packed结构。
  • 你应该首先避免位字段,它们不安全且不可移植。请改用位掩码和按位运算符。
  • 用 4 位变量合并它们。
  • 您为什么不直接使用arr 变量并相信编译器会自己进行优化?例如。 struct data arr2 = arr;

标签: c data-structures bit-manipulation bit-fields


【解决方案1】:

按照建议,将整个数据和位域结构合并。

union
{
    char Whole;
    struct data
    {
        char a:1;
        char b:2;
        char c:3;
        char d:1;
    } arr;
} MyData;

【讨论】:

  • 首先,将char 用于位域不包含在 C 标准中,它是一种非标准语言扩展。然后是位顺序和对齐 - 指定不当。然后是潜在的填充位和字节 - 指定不当。然后,与位域本身无关,char 类型的符号指定很差。未指定对位域使用有符号类型时会发生什么。等等。所以我认为任何人都无法预测这个工会会做什么。可能会工作,它可能会崩溃和烧毁,它可能会导致潜在的错误。享受使用位域的乐趣!
  • @Lundin 我完全同意。您还忘了补充说,依赖于编译器实现的字段布局也依赖于处理器字节序。它们被引入作为低级和内核编程的帮助,通常用于访问内存映射 I/O 中的硬件寄存器位。出于这个原因,它们必须被视为特定于机器/处理器并且不可移植。
猜你喜欢
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
相关资源
最近更新 更多