簡體   English   中英

使用位域時,C enum作為結構中的類型

[英]C enum as a type in a structure when using bit fields

我的理解是,bit字段聲明符的類型應該是某種int類型。 實際上,這是C99標准的產品線

“比特字段的類型應該是_Bool的有限或不合格版本,簽名> int,unsigned int或其他一些實現定義類型。”

但是,我今天遇到了一些代碼,它顯示了一個枚舉類型,就像這樣。

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

typedef struct
{
    ENUM id : 8;
}STRUCT;

沒有評論或文檔,很難說出意圖。 有人能提供一些見解嗎?

ab都是int類型, signed int 它的長度為32位 ,即4字節。

但枚舉ENUM並不需要那么多。

0000000000000000000000000000000 equals a
0000000000000000000000000000001 equals b

所以創建者想使ENUM短於intbitfield 的8位的長度的,最小長度1個字節。

00000000 or 00000001

他可以從一開始就以1字節的長度采用char類型。

在某些編譯器上,您可以激活一個功能以確保枚舉可以小於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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM