在C中使用:运算符

时间:2010-07-22 05:10:17

标签: c colon

  

可能重复:
  What does ‘: number’ after a struct field mean?
  What does ‘unsigned temp:3’ means

各位大家好,我不想问这类问题,但这真的让我烦恼,所以我会问:

下面的代码中:运算符的功能是什么?

#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/

我真的很想知道,因为我知道我在某个地方之前已经看过这个,而且当我再次看到它时我想了解它。

谢谢!

3 个答案:

答案 0 :(得分:48)

它们是位字段,例如unsigned int addr:9;创建一个9位长的addr字段。

它通常用于将大量值组合成一个整数类型。在您的特定情况下,它为(可能的)假设CPU定义32位微码指令的结构(如果将所有位域长度相加,则它们总和为32)。

union允许您加载一个32位值,然后使用代码访问各个字段(固定的小问题,特别是codetest的声明):< / p>

#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;
}

这打印出7,即构成alu位字段的三个位。

答案 1 :(得分:8)

这是一个bit field。冒号后面的数字是每个变量占用的位数。

答案 2 :(得分:1)

这是一个声明器,它指定变量的位数。

有关详细信息,请参阅:

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