32

重複の可能性:
構造体フィールドの後の「: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/

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

4

3 に答える 3

54

それらはビットフィールドであり、例として9ビット長unsigned int addr: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が出力されます。

于 2010-07-22T05:12:20.860 に答える
8

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

于 2010-07-22T05:11:59.690 に答える
1

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

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

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

于 2010-07-22T05:16:15.687 に答える