CPU中的Little Endian与Big Endian

来源:互联网 发布:图片收费网站源码 编辑:程序博客网 时间:2024/05/22 16:57

CPU中的Little Endian与Big Endian

今天在学习利用buildroot编译软件包的时候,make menuconfig之后在Target Architecture选项中发现了同一种CPU架构中有两个不同的选项,分别是little endianbig endian,如下图:
这里写图片描述
在好奇心的驱使下我就必应了一下,原来是不同CPU存储字节的顺序不同。

Little Endian与Big Endian简介

在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian,引用标准的Big-Endian和Little-Endian的定义如下:

  • Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
  • Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
  • 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。

比如int a = 0x05060708
BIG-ENDIAN的情况下存放为:

字节号 0 1 2 3 数据 05 06 07 08

LITTLE-ENDIAN的情况下存放为:

字节号 0 1 2 3 数据 08 07 06 05

通常来说,x86 cpu是Little-Endian。而一般ARM CPU也是Little-Endian。但是当前常见的开发板使用的处理器比如S3C2410A、S3C2440等都是大小端支持的,可以通过软件选择。

Little Endian与Big Endian判断方法

那么如何用程序看当前设备是什么字节序呢?
很多人的做法是使用一个指针:1

int x = 1;  if(*(char *)&x == 1)  //截取int型数据x的低八位,通过判断其是否为1来确定其数据的存储方式    printf("little-endian\n");  else  printf("big-endian\n");

或者共用体,因为在C语言中,联合体union的存放顺序是所有成员都从低地址开始存放的。利用这一特点,可以用联合体变量判断ARM或x86环境下,存储系统是是大端还是小端模式。2

  union w {  int a;  //4 bytes  char b; //1 byte } c;  c.a=1;  if (c.b==1)  printf("It is Little_endian!\n");  else  printf("It is Big_endian!\n");

祝枫
2016年7月13日于深圳

参考文献


  1. http://blog.csdn.net/lincyang/article/details/17266027 ↩
  2. http://blog.csdn.net/leoliu0128/article/details/6043910 ↩
0 0
原创粉丝点击