32

可能的重复:
结构字段后的“:数字”是什么意思?
'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

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

它通常用于将大量值打包成一个整数类型。在您的特定情况下,它为(可能)假设的 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;
}

这会打印出 7,这是组成alu位域的三位。

于 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 回答