Union 的位域使用
Bit Field Usage with Union
我想使用联合创建一个带有位字段的简单包。
但是当我尝试将 "bit1" 设置为 1 时,我所有的位字段都变成了“1”。我该如何解决这个问题,我想通过使用 union 而不是使用 struct 来完成那个位域部分。
这是我的结构;
struct {
union{
uint8_t bit1 :1 ;
uint8_t bit2 :1 ;
uint8_t bit3 :1 ;
uint8_t bit4 :1 ;
uint8_t bit5 :1 ;
uint8_t bit6 :1 ;
uint8_t bit7 :1 ;
uint8_t bit8 :1 ;
}bits;
uint8_t trial;
}myStruct_t;
int main(int argc, char *argv[]) {
myStruct_t.bits.bit1 = 1;
myStruct_t.bits.bit2 = 0;
printf("%x",myStruct_t.bits);
printf("%x",myStruct_t.bits.bit1);
printf("%x",myStruct_t.bits.bit2);
return 0;
}
输出为:000。
将您的 union
换成您的 struct
。
即我相信你想要一个结构和一个 int 的联合,而不是一个联合和一个 int 的结构。
(我保留了现在误导性的名称 myStruct_t
,现在可能应该是 myUnion_t
。)
#include <stdio.h>
#include <stdint.h>
union
{
struct
{
uint8_t bit1 :1 ;
uint8_t bit2 :1 ;
uint8_t bit3 :1 ;
uint8_t bit4 :1 ;
uint8_t bit5 :1 ;
uint8_t bit6 :1 ;
uint8_t bit7 :1 ;
uint8_t bit8 :1 ;
}bits;
uint8_t trial;
}myStruct_t;
int main(int argc, char *argv[])
{
myStruct_t.trial=0; // use the encompassing union member for init
myStruct_t.bits.bit1 = 1; // now use the bitwise view to set bits
myStruct_t.bits.bit2 = 0;
printf("%x",myStruct_t.trial);
printf("%x",myStruct_t.bits.bit1);
printf("%x",myStruct_t.bits.bit2);
return 0;
}
我得到的输出是 110,您可能会看到 12810。除了缺少换行符之外,这会有所帮助,这意味着:
- 包含的 8 位视图的值为 1,至少对于我的环境的字节顺序而言 - 您可能会看到 128
- 位 1 的值为 1
- 位 2 的值为 0
我想使用联合创建一个带有位字段的简单包。 但是当我尝试将 "bit1" 设置为 1 时,我所有的位字段都变成了“1”。我该如何解决这个问题,我想通过使用 union 而不是使用 struct 来完成那个位域部分。
这是我的结构;
struct {
union{
uint8_t bit1 :1 ;
uint8_t bit2 :1 ;
uint8_t bit3 :1 ;
uint8_t bit4 :1 ;
uint8_t bit5 :1 ;
uint8_t bit6 :1 ;
uint8_t bit7 :1 ;
uint8_t bit8 :1 ;
}bits;
uint8_t trial;
}myStruct_t;
int main(int argc, char *argv[]) {
myStruct_t.bits.bit1 = 1;
myStruct_t.bits.bit2 = 0;
printf("%x",myStruct_t.bits);
printf("%x",myStruct_t.bits.bit1);
printf("%x",myStruct_t.bits.bit2);
return 0;
}
输出为:000。
将您的 union
换成您的 struct
。
即我相信你想要一个结构和一个 int 的联合,而不是一个联合和一个 int 的结构。
(我保留了现在误导性的名称 myStruct_t
,现在可能应该是 myUnion_t
。)
#include <stdio.h>
#include <stdint.h>
union
{
struct
{
uint8_t bit1 :1 ;
uint8_t bit2 :1 ;
uint8_t bit3 :1 ;
uint8_t bit4 :1 ;
uint8_t bit5 :1 ;
uint8_t bit6 :1 ;
uint8_t bit7 :1 ;
uint8_t bit8 :1 ;
}bits;
uint8_t trial;
}myStruct_t;
int main(int argc, char *argv[])
{
myStruct_t.trial=0; // use the encompassing union member for init
myStruct_t.bits.bit1 = 1; // now use the bitwise view to set bits
myStruct_t.bits.bit2 = 0;
printf("%x",myStruct_t.trial);
printf("%x",myStruct_t.bits.bit1);
printf("%x",myStruct_t.bits.bit2);
return 0;
}
我得到的输出是 110,您可能会看到 12810。除了缺少换行符之外,这会有所帮助,这意味着:
- 包含的 8 位视图的值为 1,至少对于我的环境的字节顺序而言 - 您可能会看到 128
- 位 1 的值为 1
- 位 2 的值为 0