小端和大端的区别

Python031

小端和大端的区别,第1张

大端模式和小端模式的区别:

在C语言中除了8位的char型之外,还有16位的short型,32位的long型(要看具体的编译器),对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

大端模式:

字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

小端模式:

与大端存储模式相反,在小端存储模式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。

我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。

写一个函数判断系统是大端还是小端。若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1.

大端格式:在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中

小端格式:与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节

联合体union的存放顺序是所有成员都从低地址开始存放。

Int checkCPU ()

{

Union w

{

Int a

Char b

}c

c.a=1

return (c.b==1)

}

UNIX 网络编程 第一卷 78页 (英文版) 给出了这样一段代码:

PS: 下面代码中的unp.h是Stevens 老大自己定义的一个头文件,具体的代码在这本书的附录里有给出来.

代码

1

2 #include "unp.h"

3

4 int main(int argc ,char ** argv)

5 {

6

7 union {

8 short s

9 char c[sizeof(short)]

10 }un

11 un.s = 0x0102

12 printf("%s\n",CPU_VENDOR_OS)

13

14 if(sizeof(short) == 2)

15 {

16 if(un.c[0] == 1 &&un.c[1] ==2 )

17 printf("big-endian\n")

18 else if (un.c[0] == 2 &&un.c[1] == 1)

19 printf("little-endian\n")

20 else printf("unknow")

21 }else

22 printf ( "sizeof(short) = %d\n",sizeof(short))

23 exit(0)

24 }

25

在C语言中,不同于结构体,共用体(联合体)中的几种不同类型的变量存放在同一段内存单元中。利用这一特点,可以用联合体变量判断ARM或x86环境下,存储系统是是大端还是小端模式。

#include "stdio.h"

int main()

{

  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")

  return 1

}