C语言union内嵌struct
实际开发中经常有如下的需求:
- 访问32位变量的整体值
- 访问32位变量的某些位
为满足上面的需求骂我们经常会写这样的结构
32位变量的
union MyUnion{
uint32_t v;
struct{
uint32_t bit0:1;
uint32_t bit : 30;
uint32_t bit31 : 1;
};
}s;
以便满足需求。
那么有一个问题是,写在前面的bit0,是v的第31位,还是第0位呢?
于是就有了如下测试。
#include "stdio.h"
#include "stdint.h"
#define TEST_SINGLE_BIT
int main(void)
{
union MyUnion{
uint32_t v;
struct{
#ifndef TEST_SINGLE_BIT
uint32_t bit0:1;
uint32_t bit : 30;
#endif
uint32_t bit31 : 1;
};
}s;
s.v = (1UL << 31);
#ifndef TEST_SINGLE_BIT
printf("v=0X%X s.bit31=%d bit0= %d\n",s.v, s.bit31,s.bit0);
#else
printf("v=0X%X bit0= %d\n",s.v,s.bit31);
#endif
return 0;
}
测试结论
对于gcc,写在前面的bit为低位。
对于VS,同上