大端模式 小端模式
简介
大端小端模式指的是不同类型的处理器在数据存储时的区别。。
- 大端模式(高尾端模式即末端在高位):将数据的高字节放在低地址中,低字节放在高地址中。
- 小端模式(低尾端模式即末端在低位):将数据的高字节放在高地址中,低字节放在低地址中。
如: 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是平台无关的,默认是大端。在网络上传输数据普遍采用的都是大端。详见