【问题标题】:Use of the : operator in C [duplicate]在 C 中使用 : 运算符 [重复]
【发布时间】:2010-07-22 05:10:16
【问题描述】:

可能的重复:
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/

我真的很想知道,因为我知道我以前在某个地方看到过这个,我想在我再次看到它时理解它。

【问题讨论】:

  • 请注意,位域的布局是实现定义的,因此通过联合访问 int 中的位域的结果是未定义的。不要在生产代码中这样做,而是使用位掩码和移位。

标签: c colon


【解决方案1】:

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

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

联合允许您加载单个 32 位值,然后使用以下代码访问各个字段(还修复了一些小问题,特别是 codetest 的声明):

#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 位域的三位。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      欲了解更多信息,请参阅:

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

      【讨论】:

      • 链接失效
      猜你喜欢
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 2020-04-29
      • 1970-01-01
      • 2013-06-04
      相关资源
      最近更新 更多