c++ union位域
来源:互联网 发布:淘宝网店注册 编辑:程序博客网 时间:2024/06/17 18:59
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明。否则将追究法律责任。http://zhouxiaodan.blog.51cto.com/1177793/1202163
最近碰到一道题,顺带复习一下union的数据分布,题目如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
union
packet
{
struct
packet_bit
{
unsigned
char
a:2;
unsigned
char
b:3;
unsigned
char
c:4;
} bit;
int
i;
} data;
int
main()
{
data.i = 0;
data.bit.a = 1;
data.bit.b = 2;
data.bit.c = 15;
printf
(
"0x%04x\n"
,data.i);
return
0;
}
先来看一下struct packet_bit是如何分布的
成员a、b、c都是char型,所占的位数为2,3,4。由于union类型不能跨字节(本题为unsigned char,为单字节),所以a、b在同一个字节内,后面补3个位,c在第二个字节内。而struct packet的size为4个字节,所以其分布图如下:
(第一字节) (第二字节)
—— —— —— —— —— —— —— ——|—— —— —— —— —— —— —— ——|后16位为0(两个字节)
( b )( a ) ( c )
因为字节填充是从低位填起,所以a、b、c的分布情况如上图,由不同的颜色标出。
所以,当执行赋值语句后,a=1,b=2,c=15,对应上图的情况是:
(第一字节) (第二字节)
—— —— —— 0 1 0 0 1|—— —— —— —— 1 1 1 1|后16位为0(两个字节)
( b ) ( a ) ( c )
所以data.i在大端的情况下的值为:0x090f0000
小端的情况下,值为:0x00000f09。
所以上面的答案为 0x0f09。(intel cpu)
关于union不能跨类型字节的理解,可以看下面这个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
typedef
struct
_strBitData_
{
unsigned
int
ulData1:2;
unsigned
int
ulData2:12;
unsigned
int
:2;
}strBitData;
typedef
struct
_chBitData_
{
unsigned
char
ulData1:2;
unsigned
char
ulData2:7;
unsigned
char
:2;
}chBitData;
int
main()
{
strBitData stData;
chBitData chData;
unsigned
int
*pOuputData;
unsigned
char
*pchOuputData;
memset
((
void
*)&stData, 0,
sizeof
(strBitData));
memset
((
void
*)&chData, 0,
sizeof
(chBitData));
stData.ulData1 = 0x7;
stData.ulData2 = 0x010;
chData.ulData1 = 0x7;
chData.ulData2 = 0x010;
pOuputData = (unsigned
int
*)&stData;
pchOuputData = (unsigned
char
*)&chData;
printf
(
"0x%x\n"
, *pOuputData);
printf
(
"0x%x\n"
, *pchOuputData);
return
0;
}
0x3
如果位域在类型的范围内,则拼接,否则,不可以跨类型拼接。
- c++ union位域
- 位域与union结构
- 位域与union结构
- union及内存位域
- UNION和位域的使用
- C语言位段与联合体(union)的内存分配
- c union
- c union
- c++union
- union And 位域(一代码分析)
- 字节序 位域 联合 (bit field and union)
- C位域
- C/C++位域
- C语言 位域
- c语言位域
- c/c++位域
- C/C++位域
- c语言位域
- X86上的Android手机:性能与兼容可否兼得
- NSSortDescriptor
- 四个流行的Java连接池
- 李孟:构建强健的DNS解析系统
- 十年程序员之路
- c++ union位域
- 分布式系统与集群的区别(二)
- 郁万玲:大数据时代的外贸精准营销
- 史玉柱:我是怎么做游戏策划的
- 又拍云存储95折优惠推荐码【每两天更新一次】,附:给Wordpress添加CDN存储
- MySQL中取出一列中含有最大值的记录
- mysql服务的启动和停止 net stop mysql net start mysql
- 对struts2的基本知识和环境的搭建(配图解)
- 什么是CIS系统