c - 整数宽度与位域声明相关吗?

标签 c integer bit-fields

我试图找到一个不应该写的理由

struct bitfield {
  signed foo:4;
  unsigned bar:2;
};

而不是详细指定

struct bitfield {
  signed int foo:4;   
  unsigned int bar:2; 
};

由于位域每个成员的大小是在冒号后显式指定的,是否会有任何缺点?

如果我使用 charshortlonglong long 有关系吗?指定位域位数是否必须始终小于声明类型的宽度?


发现一些相关问题:

答案范围为

  • 请勿使用除(有符号/无符号)int_Bool 之外的任何其他类型和
  • _Boolsigned intunsigned int 或其他一些实现定义的类型。 (C99 6.2.7.1(4))

在这种情况下:这个非特定的其他实现定义的类型可能是什么样子,以及我在这个地方的选择可能会产生哪些其他缺点?

最佳答案

“有时”和"is"

C99 要求宽度表达式“不超过指定类型的对象中的位数”,因此如果使用太小的类型,代码将无法编译或在至少不能便携。参见§6.7.2.1 (3)。

关于更新的第三个问题和一般性的“具体后果是什么?”问题,可能受到影响的事情是:可移植性、对齐和填充。该标准仅针对第一个给出了明确的规范。如果没有位域,通常可以根据预测编译器将如何生成最佳对齐值来安排对齐和填充。虽然不能保证,但在某些环境中,使用 short 之类的东西似乎会由于减少对齐和填充而节省内存。

实现精确布局和可移植性之间偶尔发生冲突的目标的一种可能方法是声明不带位字段的内存中数据结构,也许使用 <stdint.h>类型。然后,如果您想使用位字段来解码某些内容,请将内存中的源对象分配给一个临时变量,该变量是位字段和位特定类型的 union ,或者通过强制转换来故意违反类型双关规则。指针。 (Linux 到处都是这样做的。)

更好的方法可能是避免位字段。

关于c - 整数宽度与位域声明相关吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10271265/

相关文章:

c - GCC 在缓冲区的末尾添加了一些填充,如何禁用它

c - 在队列哈希表中插入错误作为链表?

c# - 字符串中的 double 或整数?

c++ - 2 Nibbles 结构、赋值运算符和位集。如何?

c - C语言多线程服务器设计

c - 为什么基本算术运算符不需要 math.h 库

swift - 为什么 Xcode 将我的 Integers 转换为 Floats 而无需我分配它这样做?

java - 遍历整数树集并将 next() 中的值存储到整数变量

language-agnostic - 如何选择位标志值?

c - 探索结构包装