大端模式 小端模式

简介

大端小端模式指的是不同类型的处理器在数据存储时的区别。。

  • 大端模式(高尾端模式即末端在高位):将数据的高字节放在低地址中,低字节放在高地址中。
  • 小端模式(低尾端模式即末端在低位):将数据的高字节放在高地址中,低字节放在低地址中。

如: 0x01020304

在大端模式的机器中存储形式如图:

高地址<---------------------------------------------------------低地址
04 03 02 01

 

 

 

在小端模式的机器中存储形式如图:

高地址<------------------------------------------------------低地址
01 02 03 04

 

 

 

判断

可以使用程序测试本地机器是大端模式还是小端模式,

#include "stdafx.h"
#include "Windows.h"

//         高地址  <---------------  低地址
//大端存储:04 03 02 01
//小端存储:01 02 03 04
#define Testdata 0x01020304  //测试数据

union TestEndMode
{
    unsigned int u;
    unsigned char c[4];
};

int main(int argc, char* argv[])
{

/*    unsigned int a;
    int b = sizeof(char);
    BYTE c = 0x12;//十六进制:以0x开头
    BYTE d = 012;//八进制:以0开头
    printf("%d  %d",c,d);
*/

    int i;
    TestEndMode tstMode;
    tstMode.u = Testdata;

    printf("%08x\n", tstMode.u);
    for (i = 0; i < 4; i++)
        printf("%02x", (unsigned int)(unsigned char)tstMode.c[i]);
    printf("\n");//输出:01020304 处理器为大端模式;04030201 处理器为小端模式
    return 0;

}

翻转

当不同的处理器的硬件通信时,大小端模式必然要多加考虑。一旦有大小端的区别,有一方必然要对数据进行处理。在处理时针对数据进行高低颠倒。可以根据联合体union的特点对数据进行翻转。

union TestEndModeUInt
{
    unsigned int value;//根据不同的数据类型,改变该类型
    unsigned char swapTemp[4];//数组长度需要根据类型进行更改
};

unsigned int SwapInt(unsigned int value)
{
   int i = 0;
   TestEndModeUInt tstUInt;
   tstUInt.value = value;
   unsigned char temp;
   int len = sizeof(value);

    for(i = 0; i< len/2; i++)
    {
        temp = tstUInt.swapTemp[i];
        tstUInt.swapTemp[i] = tstUInt.swapTemp[len-i-1];
        tstUInt.swapTemp[len-i-1] = temp;        
    }
    return tstUInt.value;
}

存在状况

目前Intel的80x86系列芯片是唯一还在坚持使用小端的芯片,ARM芯片默认采用小端,但可以切换为大端;而MIPS等芯片要么采用全部大端的方式储存,要么提供选项支持大端——可以在大小端之间切换。另外,对于大小端的处理也和编译器的实现有关,在C语言中,默认是小端(但在一些对于单片机的实现中却是基于大端,比如Keil 51C),Java是平台无关的,默认是大端。在网络上传输数据普遍采用的都是大端。详见

 

posted @ 2017-10-15 23:39  zht01  阅读(357)  评论(0编辑  收藏  举报