全部博文(1293)
分类: C/C++
2012-11-03 16:38:27
一、工程案例
1、工程代码
2、运行效果
图、linux下的执行结果
图、 windows下的执行效果
由图证明,PC机的CPU采用的是小端存储的方式。
二、案例分析
1、判断主机大、小端数据存储方式的方法
快速判断何为大端,何为小端?
|高址减低数|,值大差异大,是大端;
|低址减低数|,值小差异小,是小端;
(1)、读整型数的低位的值,看是否所给的数的低位相同;
是则为小端,否则为大端模式;
- int i = 0x12345678;
- char* c = (char* )&i;
- if(*c == 0x78)
(2)、利用联合体共同内在的特点,判断低位。
- u.i = 0x00000001;
- if(u.c == 0x01)
图 小端存储示意图
表 数据存储格式表
2、上面提到的联合体的特点分析
由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0,即所有成员的首地址都是一样的。为了使得所有成员能够共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合其中所有的成员”是指其必须符合所有成员的自身对齐方式。
下面举例说明:
如联合体
- union U
- {
- char s[9];
- int n;
- double d;
- };
s占9字节,n占4字节,d占8字节,因此其至少需9字节的空间。然而其实际大小并不是9,用运算符sizeof测试其大小为16.
故上面代码中的联合体:
- union
- {
- int i;
- char c;
- }u;
- u.a = 0x00000001;
由上图,
if(u.c == 0x01)
一读c的值,如果是01,那么这就是小端存储了。
3、依此输出整型数的每个字节的关键代码
上面这段代码如何得到下面的结果,请参考下面文章:
http://blog.chinaunix.net/uid-25498312-id-4549292.html
图 数据在内在的小端存储
图 数据的从低位到高位输出
附一张内存示意简图