高科技C编译器位结构

高科技C编译器位结构,c,struct,C,Struct,我正在PIC控制器上使用带有高科技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; }ColorPi

我正在PIC控制器上使用带有高科技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;
现在我不确定它是否被正确声明,当我在上面掉一些移位时会发生什么。 在我的结果中,它应该只有一位aktive(1)和所有其他低位(0)

那么,“白色”是位0b00000001还是位0b10000000? 当我移动它6次,我会变成黄色,然后又变成白色。
我可以在Hi-Tech C用户手册第346页的ColorPick的相同功能调用中执行此操作吗:

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);
然后根据需要替换中的值,以查看编译器将它们粘贴到何处。如果需要与其他计算机/编译器通信,您最好自己使用掩码和移位