C语言深度解剖(精讲版)——读书笔记7 &&自己的一些理解

第一章:关键字

union 关键字

知识点一: 在union中所有的数据成员共用一个空间,同一时间只能存储其中一个数据成员,所有数据成员具有相同的起始地址。例如:

union StateMachine

{

char character;

int number;

char *str;

double exp;

};

一个union只配置一个足够大的空间来容纳最大长度的数据成员,以本例而言,最大长度是double类型,所以StateMachine的空间大小就是double数据类型的大小。

知识点二: 大小端模式对union类型的数据影响

下面看一个例子:

union

{

int i;

char a[2];

}*p,u;

p =&u;

p->a[0] =0x39;

p->a[1] =0x38;

p.i的值应该是多少呢?

这里需要考虑存储模式:大端和小端模式;

大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

***union型数据所占的空间等于其最大的成员所占的空间。

***对union 型成员的存储都从相对于该联合体基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union的首地址位置开始的。

由此可看出:p.i的值应该为0x39

知识点三:如何用程序确认当前系统的存储模式

请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的则返回1;

先分析一下,按照上面关于大小端的定义,假设int类型变量i被初始化为1.

以大端模式存储,其内存布局如图:

大端模式:int i=1;

0x0

0x0

0x0

0x1

------------------------------------------------->高地址

小端模式: int i=1;

0x1

0x0

0x0

0x0

------------------------------------------------->高地址

变量i 占4个字节,但只有1个字节的值为1,另外3个字节的值都为0;如果取出低地址上的值为0,这是大端模式;如果取出的低地址上的值为1,这是小端模式;

所以我们利用union类型数据“所有成员的起始地址一致性”的特点编写程序。

参考如下:

int checkSystem()

{

union check

{

int i;

char ch;

} c;

c.i =1;

return (c.ch==1);//这句我觉得写得很高水平,如果是小端模式则c.ch1,那么c.ch==1这个判断是正确的返回1。如果是大端模式返回0

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值