-1

我在 PIC 控制器上使用带有 Hi-Tech C 编译器的 MPLAB X IDE。因此,重要的是有点“面向字节”。所以我尝试以下方法:

volatile struct{
   unsigned bit white:1;
   unsigned bit red:1;
   unsigned bit blue:1;
   unsigned bit green:1;
   unsigned bit violett:1;//Magenta
   unsigned bit yellow:1;
}ColorPick;

现在我不确定它是否被正确声明以及当我在上面放置一些位移时会发生什么。在我的结果中,它应该只有一点活跃 (1) 和所有其他低 (0)。

那么“白色位 0b00000001 或 0b10000000 是什么?当我移动它 6 次时,我会变黄。然后又是白色。我可以在 ColorPick << 1; 的相同功能调用中做到这一点吗?

我猜 1 被转移到第 7 位和第 8 位,我没有这样声明。

我该如何纠正?

4

1 回答 1

1

来自 Hi-Tech C 用户手册,第 346 页:

A.9.4 int (6.5.2.1) 中位域的分配顺序

结构中定义的第一位字段被分配在存储单元中的最低有效位位置。随后的位域被分配高阶位。

根据文档,我认为这不是bit编译器中的关键字。

根据我的经验,位域依赖于编译器。我确定位对齐的方法是编写一个小命令行程序,它执行以下操作:

union test_u {
   struct test_s {
      unsigned long bwhite : 1;
      unsigned long bred : 1;
      unsigned long bblue : 1;
      unsigned long bgreen : 1;
      unsigned long bviolet : 1;
      unsigned long byellow : 1;
      unsigned long bpink : 1;
   } bits;
   unsigned long unlong;
} bitest;

bitest.unlong = 0;
bitest.bred = 1;
printf("0x%8.8X\n", bitest.unlong);

然后根据需要替换值以查看编译器将它们粘贴在哪里。如果您需要与其他计算机/编译器进行通信,您最好自己使用掩码和转换。

于 2013-03-11T16:16:24.290 回答