Chinaunix首页 | 论坛 | 博客
  • 博客访问: 549803
  • 博文数量: 181
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1498
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-22 15:17
个人简介

用发呆的时间来理清自己的思绪

文章存档

2015年(7)

2014年(134)

2013年(40)

分类: 嵌入式

2014-09-13 22:47:45

    所谓大小端,主要是指一个数据的高低位和地址的高地位的对应关系,定义如下
    大端:高字节放在低地址,低字节放在高地址
    小端: 高地址放在高地址,低字节放在低地址
    例子如下:
    int a = 0x12345678,大小端的各自存放情况如下:

                                   大端存放                              
                  -----------------------------------------------
    低地址        |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |    高地址  
                  -----------------------------------------------

                                   小端存放                              
                  -----------------------------------------------
    低地址        |  8  |  7  |  6  |  5  |  4  |  3  |  2  |  1  |    高地址  
                  -----------------------------------------------
    注意:不管数据是以大端还是小端的方式存放,我们读取的时候都是从低地址开始读取,并且根据变量的类型我们读取的字符个数不同,这一点对于理解大小端来说至关重要,如果变量是int型的,则一次性读取4个字节,相反如果是char型的,则一次性只读取一个字节的数据,其他类型依次类推……,假如,我们需要有如下语句:
    unsigned char *ch = (unsigned char *)(&a),此时把a强制转化为char *型的,此时只能读取一个字节的值;
    unsigned char a = *ch;则此时根据cpu的大小端架构的不同,从低地址开始读取一个字节的内容可能会出现两个值:
    大端的情况下:a = 0x12  //注意,写的是0x12,实际上是由低到高是-->1-->2的顺序
    小端的情况下:a = 0x78  //注意,写的是0x78,实际上是由低到高是-->8-->7的顺序
    下面自己写一个判断cpu大小端的程序,代码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. //C言中并不支持bool类型,而C++中是有,但是C99标准当中,定义了bool类型,需要包含stdbool.h头文件
  3. #include <stdbool.h

  4. bool is_big_endian()
  5. {
  6.     unsigned int a = 0x12345678;

  7.     //把int型强转为unsigned char 型,目的是只读一个字节的内容
  8.     return(*((unsigned char *)&a) == 0x12);
  9. }

  10. int main(int argc, const char *argv[])
  11. {
  12.     bool ret;

  13.     ret = is_big_endian();
  14.     
  15.     if(ret == true)
  16.     {
  17.         printf("big endian\n");
  18.     }
  19.     else
  20.     {
  21.         printf("little endian\n");
  22.     }

  23.     return 0;
  24. }
    我自己的机器是intel的处理器,是小端模式的,因此,最后应该输出little endian,运行结果如下:

点击(此处)折叠或打开

  1. ubuntu@ubuntu:~/interview/c_study$ gcc endian.c
  2. ubuntu@ubuntu:~/interview/c_study$ ./a.out
  3. little endian
阅读(1148) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~