web-dev-qa-db-ja.com

Cでの:演算子の使用

可能な重複:
structフィールドの後の ‘:number'はどういう意味ですか?
「unsigned temp:3」の意味

私はこの種の質問をするのが嫌いですが、それは本当に私を悩ませているので、私は尋ねます:

以下のコードの:演算子の機能は何ですか?

#include <stdio.h>

struct microFields
{
  unsigned int addr:9;
  unsigned int cond:2;
  unsigned int wr:1;
  unsigned int rd:1;
  unsigned int mar:1;
  unsigned int ALU:3;
  unsigned int b:5;
  unsigned int a:5;
  unsigned int c:5;
};

union micro
{
  unsigned int microCode;
  microFields code;
};

int main(int argc, char* argv[])
{
  micro test;
  return 0;
} 

誰かが気になっている場合は、このコードを以下のリンクからプルしました: http://www.cplusplus.com/forum/beginner/15843/

どこかでこれまでに見たことがあり、また見たときに理解したいので、本当に知りたいです。

28
Russel

それらはビットフィールドであり、その例はunsigned int addr:9;は、9ビット長のaddrフィールドを作成します。

多くの値を整数型にパックするためによく使用されます。あなたの特定のケースでは、(おそらく)仮想CPUの32ビットマイクロコード命令の構造を定義します(すべてのビットフィールド長を合計すると、合計は32になります)。

ユニオンを使用すると、単一の32ビット値をロードしてから、次のようなコードで個々のフィールドにアクセスできます(マイナーな問題も修正され、特にcodeおよびtestの宣言)。

#include <stdio.h>

struct microFields {
    unsigned int addr:9;
    unsigned int cond:2;
    unsigned int wr:1;
    unsigned int rd:1;
    unsigned int mar:1;
    unsigned int ALU:3;
    unsigned int b:5;
    unsigned int a:5;
    unsigned int c:5;
};

union micro {
    unsigned int microCode;
    struct microFields code;
};

int main (void) {
    int myAlu;
    union micro test;
    test.microCode = 0x0001c000;
    myAlu = test.code.ALU;
    printf("%d\n",myAlu);
    return 0;
}

これは、ALUビットフィールドを構成する3ビットである7を出力します。

50
paxdiablo

ビットフィールド です。コロンの後の数字は、各変数が占めるビット数です。

8
dan04

これは、変数のビット数を指定する宣言子です。

詳細については、以下を参照してください。

http://msdn.Microsoft.com/en-us/library/yszfawxh(VS.80).aspx

1
tgiphil