【C语言】大端小端详解

1、什么是大小端模式?

大端模式是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。

小端模式是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

举个栗子:

比如数字 0x12 34 56 78在内存中的表示形式为:

1)大端模式:

低地址 -----------------> 高地址

0x12  |  0x34  |  0x56  |  0x78

2)小端模式:

低地址 ------------------> 高地址

0x78  |  0x56  |  0x34  |  0x12

可见,大端模式和字符串的存储模式类似。

2、知道大小端有何用?

 首先要介绍一下字节序列,所谓的字节序列就是大于或者等于两个字节类型的数据存放在内存中的顺序(一个字节就不必谈序列!)。那么什么时候要用到我们去判断机器是大端模式还是小端模式呢?当我们在跨平台开发或者网络编程的时候就要去关心字节序列了,比如说我们用机器A和B通信,如果A和B的端序都是一样的话,中间自然就不用转换来转换去了。但是如果A和B机器的端序不一样,如果我们不去做相应的转换,我们传过去的二进制序列就是反的

3、大端小端没有谁优谁劣,各自优势便是对方劣势:

小端模式 :强制转换数据不需要调整字节内容 。

大端模式 :符号位的判定固定为第一个字节,容易判断正负。

4、为什么会有大小端模式之分呢?

这是因为在计算机中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8 bit。但是在C 语言中除了 8 bit 的char之外,还有 16 bit 的 short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型 x ,在内存中的地址为 0x0010,x 的值为0x1122,那么0x11位高字节,0x22位低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

/*一般操作系统都是小端,而通讯协议是大端的*/

5、如何去判断机器是大端模式还是小端模式?

第一种:

[plain]  view plain  copy
  1. #include  
  2. int main()  
  3. {  
  4.     int i = 0x12345678;  
  5.     char c = i;  
  6.     printf("%x \n", c);  
  7.     return 0;  
  8. }  

注:这种方式的定义一个int型的数据类型,初始化为十六进制0x12345678,在内存中存放的位置从低位到高位,依次为(低位)87654321(高位);再定义一个占一个字节的char型,然后把int型数据赋值给char型数据,因为char占一个字节,int占四个字节,这样赋值就会丢掉三个字节,但是这正是我们需要的,如果它打印出78(小端模式),如果打印出12(大端模式)。

第二种:

[plain]  view plain  copy
  1. #include  
  2. int main()  
  3. {  
  4.     int i = 0x12345678;  
  5.     char *c = (char *)&i;  
  6.     printf("%x \n", *c);  
  7.     return 0;  
  8. }  

这种方式和上面那种方式差不多,只是运用到了指针的知识,原理都一样

第三种:

[plain]  view plain  copy
  1. #include
  2. typedef union NODE  
  3. {  
  4.     int i;  
  5.     char c;  
  6. }Node;  
  7. int main()  
  8. {  
  9.     Node node;  
  10.     node.i = 0x12345678;  
  11.     printf("%x\n", node.c);  
  12.     return 0;  
  13. }  

注:种方式运用到了union(共用体),所谓的共用体,就是共同使用一块内存,共用体的大小是共用体中的所有类型最大的哪一个,例如上面的共用体中int是四个字节,char为一个字节,那么这个共用体的大小就是四个字节。当然这个要看你的系统是多少位的(在这里我说的是32位系统,64位系统int是8个字节),先对共用体中的int型数据i赋初值,然后在用char去访问一个字节的数据,如果打印出结果为78(小端模式),反之为大端模式。



你可能感兴趣的:(C语言知识总结)