【问题标题】:Integer type of a bitfield位域的整数类型
【发布时间】:2021-02-25 22:33:36
【问题描述】:

位域的整数类型重要吗,或者说它基本上是一次性的,例如:

struct font {
    int bold : 1;
    int italics : 2;
    int underline : 1;
};

对比

struct font {
    unsigned int bold : 1;
    unsigned int italics : 2;
    unsigned int underline : 1;
};

对比

struct font {
    char bold : 1;
    char italics : 2;
    char underline : 1;
};

不同的整数类型在这里“做”什么,或者它基本上是一个占位符?

【问题讨论】:

  • 好吧,int bold : 1; 只能是-10,而unsigned int bold : 1; 可以是10
  • @KamilCuk 当我使用 int 字段时,如果我设置 bold=1,编译器不会抱怨,但如果我设置 bold=2,它会抱怨。
  • 当您执行char a = 1000; 时,编译器也不会报错,但char 可以(通常;)只能将-128 保持到127... 该值已转换到目标类型的范围。

标签: c bit-fields


【解决方案1】:

位域使用有符号或无符号类型会导致它可以保存的值不同。在您的第一个示例中,bold 可以保存值 0 或 -1,而在您的第二个示例中,bold 可以保存值 0 和 1。

C 标准特别允许 intunsigned int_Bool 作为位字段的类型,并支持其他类型的实现定义。大多数实现都允许位域使用任何整数类型。

对于那些这样做的人,类型指定了位域所在的“桶”的大小,因此它可以影响结构的大小。在我的 gcc 下的机器上,前两个结构的大小为 4,而第三个结构的大小为 1。

【讨论】:

  • 一个需要澄清的问题。这句话:“C 标准特别允许 int、unsigned int 或 _Bool”——您的意思是“C 标准 for a bit field ... 吗?
  • @David542 是的。已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 2010-09-13
  • 1970-01-01
相关资源
最近更新 更多