【问题标题】:Why does this code contains colon in struct?为什么这段代码在结构中包含冒号?
【发布时间】:2020-06-05 13:35:37
【问题描述】:

请解释这段代码是如何执行的。为什么我们在结构中使用“:”。结构中冒号的用途是什么。sizeof 运算符的输出应该是什么。

#include <stdio.h>
int main()
{
struct bitfield {
    signed int a : 3;
    unsigned int b : 13;
    unsigned int c : 1;
};
struct bitfield bit1 = { 2, 14, 1 };
printf("%ld", sizeof(bit1));
return 0;
}

【问题讨论】:

  • : 用于定义struct(或union)中的位域。
  • 我认为“sizeof 运算符的输出应该是什么”的唯一答案是“它取决于”。架构字长、对齐和填充等

标签: c struct unsigned signed


【解决方案1】:

它是bit fields 语法的一部分。 这里表示a占3位,b占13位,c只占1位。 当然该结构不会只占用内存中的 17 位,因为它必须与作为最小可寻址内存单元的字节对齐,因此sizeof(bit1) 将至少为 3 个字节(可能会与某个机器相关的值对齐字,例如 4 个字节)。 您可以在此处阅读有关对齐的更多信息:Structure padding and packing。 我假设 1 个字节是 8 位大小,但在一些旧的或奇特的架构中,字节有另一个大小。

【讨论】:

    【解决方案2】:

    : 运算符用于bit fields,即使用较大空间的指定位数的整数值。这些可能会被打包成机器字以节省空间,但实际行为是由实现定义的。

    现在,“sizeof 运算符的输出应该是什么”这个问题很简单,但答案很复杂。

    sizeof operator 表示它返回字节数,但“字节”的定义不一定是你想的那样。一个字节必须至少为 8 位,但可以更多。 9、12 和 16 位并非闻所未闻。

    给定平台的sizeof(int) 可能因架构字长而异。假设字节大小为 8 位,sizeof(int) 可能是 2、4 或 8。可能更多。如果字节大小为 16,sizeof(int) 实际上可能是 1。

    现在,记得我说过,位域是否被打包取决于实现?好吧,这将在这里产生很大的不同。每个位字段都可以放入一个单独的字中。或者它们都可以打包成一个。

    很可能,您使用的是 8 位字节和 32 或 64 位 ints 的 Intel 平台,编译器可能会打包位字段。因此,您的 sizeof(bit1) 可能是 4 或 8。

    【讨论】:

      猜你喜欢
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多