Chinaunix首页 | 论坛 | 博客
  • 博客访问: 330407
  • 博文数量: 243
  • 博客积分: 86
  • 博客等级: 民兵
  • 技术积分: 1045
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-09 17:03
个人简介

稳重,成熟

文章分类

全部博文(243)

文章存档

2015年(2)

2013年(72)

2012年(169)

我的朋友

分类: C/C++

2013-03-22 09:30:51

一、工程案例

1、工程代码

  1. /****************************************************************
  2. * Name : int_type.c
  3. * Author : dyli2000
  4. * Date : 2012103
  5. * Description :
  6. * 代码判断CPU是大端还是小端模式的方法实现;实现对一个整型数第一个字节输出
  7. ****************************************************************/
  8. #include <stdio.h>

  9. union
  10. {
  11.     int i;
  12.     char c;
  13. }u;

  14. void IsBigOrLittleEndian_Func1()
  15. {
  16.     int i = 0x12345678;
  17.     char* c = (char* )&i;
  18.     if(*c == 0x78)
  19.         printf("Little Endiann");
  20.     else
  21.         printf("Big Endiann");
  22. }

  23. void IsBigOrLittleEndian_Func2()
  24. {
  25.     u.i = 0x00000001;
  26.     if(u.c == 0x01)
  27.         printf("小端格式n");
  28.     else
  29.         printf("大端格式n");
  30. }

  31. int main()
  32. {
  33.     IsBigOrLittleEndian_Func1();
  34.     IsBigOrLittleEndian_Func2();

  35.     /* 取出一个整数的四个字节里面的每个字节的值 */
  36.     int in = 0x12345678;
  37.     char char_ic_len[4];

  38.     char_ic_len[0] = in;
  39.     char_ic_len[1] = in>>8;
  40.     char_ic_len[2] = in>>16;
  41.     char_ic_len[3] = in>>24;

  42.     printf("%Xn",char_ic_len[0]);
  43.     printf("%Xn",char_ic_len[1]);
  44.     printf("%Xn",char_ic_len[2]);
  45.     printf("%Xn",char_ic_len[3]);
  46.     printf("%dn",in);
  47.     printf("%Xn",in);

  48. }




2、运行效果


图、linux下的执行结果

图、 windows下的执行效果

    由图证明,PC机的CPU采用的是小端存储的方式。

二、案例分析

1、判断主机大、小端数据存储方式的方法

    快速判断何为大端,何为小端?

    |高址减低数|,值大差异大,是大端;

    |低址减低数|,值小差异小,是小端;

(1)、读整型数的低位的值,看是否所给的数的低位相同;

是则为小端,否则为大端模式;


  1. int i = 0x12345678;
  2. char* c = (char* )&i;
  3. if(*c == 0x78)


 

(2)、利用联合体共同内在的特点,判断低位。


  1. u.i = 0x00000001;
  2.     if(u.c == 0x01)

image

图 小端存储示意图

 

image

表 数据存储格式表

 

2、上面提到的联合体的特点分析

   由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0,即所有成员的首地址都是一样的。为了使得所有成员能够共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合其中所有的成员”是指其必须符合所有成员的自身对齐方式。

下面举例说明:

如联合体


  1. union U

  2. {

  3. char s[9];

  4. int n;

  5. double d;

  6. };


s占9字节,n占4字节,d占8字节,因此其至少需9字节的空间。然而其实际大小并不是9,用运算符sizeof测试其大小为16.

故上面代码中的联合体:


  1. union
  2. {
  3.     int i;
  4.     char c;
  5. }u;

  6. u.a = 0x00000001;


image

由上图,

if(u.c == 0x01)

一读c的值,如果是01,那么这就是小端存储了。

 

3、依此输出整型数的每个字节的关键代码


  1. int in = 0x12345678;
  2.     char char_ic_len[4];

  3.     char_ic_len[0] = in;
  4.     char_ic_len[1] = in>>8;
  5.     char_ic_len[2] = in>>16;
  6.     char_ic_len[3] = in>>24;

上面这段代码如何得到下面的结果,请参考下面文章:
http://blog.chinaunix.net/uid-25498312-id-4549292.html

 

image

图 数据在内在的小端存储

 

image

图 数据的从低位到高位输出

 

 

附一张内存示意简图

image
阅读(924) | 评论(0) | 转发(0) |
0

上一篇:C语言编程实例全。

下一篇:mount源码分析

给主人留下些什么吧!~~