4

ビットフィールド宣言子の型は int 型である必要があるというのが私の理解でした。実際、これはC99標準の行です

「ビットフィールドは、_Bool、signed >int、unsigned int、またはその他の実装定義型の修飾または非修飾バージョンである型を持つものとします。」

しかし、今日、このように列挙型を型として示すコードに出くわしました。

typedef enum
{
    a = 0,
    b = 1
}ENUM;

typedef struct
{
    ENUM id : 8;
}STRUCT;

コメントやドキュメントがなければ、意図を伝えるのは困難です。誰でも洞察を提供できますか?

4

1 に答える 1

4

abはどちらもintタイプですsigned int。長さは32 ビット、つまり 4 バイトです。

しかし、列挙型ENUMはそれほど必要ではありません。

0000000000000000000000000000000 equals a
0000000000000000000000000000001 equals b

そこで作成者は、長さ8 ビット、最小長 1 バイトのaENUMよりも短くすることを考えました。intbitfield

00000000 or 00000001

char最初から 1 バイトの長さの型を取ることもできたのですが。

一部のコンパイラでは、機能を有効にして、列挙型が int よりも小さくなるようにすることができます。GCC のオプション --short-enums を使用すると、すべての値に適合する最小の型が使用されます。


これは、ビットフィールドを使用してメモリを節約する方法の例です。someBits構造体が構造体よりも小さいことがわかりますtwoInts

#include "stdio.h"

struct oneInt {
  int x;
};

struct twoInts {
  int x;
  int y;
};

struct someBits {
  int x:2; // 2 Bits
  int y:6; // 6 Bits
};


int main (int argc, char** argv) {
  printf("type int = %lu Bytes\n", sizeof(int));
  printf("oneInt = %lu Bytes\n", sizeof(struct oneInt));
  printf("twoInts = %lu Bytes\n", sizeof(struct twoInts));
  printf("someBits = %lu Bytes\n", sizeof(struct someBits));
  return 0;
}

出力:

type int = 4 Bytes
oneInt = 4 Bytes
twoInts = 8 Bytes
someBits = 4 Bytes
于 2013-11-01T10:11:57.270 に答える