1、前言
大端模式(Big-Endian),是指数据的高字节存储在内存的低地址中,而数据的低字节存储在内存的高地址中,这样的存储模式有点类似把数据当作字符串顺序处理,地址从小向大增加,而数据从高位到低位存放,通常和我们的阅读习惯一致。
小端模式(Little-Endian),是指数据的高字节存储在内存的高地址中,而数据的低字节存储在内存的低地址中,这样的存储模式将地址的高低和数据位权有效地结合起来。
为什么会有大端模式和小端模式之分呢?这是由于在计算机系统中,是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit,但是在编程语言中,除了8bit的char数据类型以外,还有16bit的short数据类型,32bit的int数据类型等,需要看具体的编译器,另外,对于位数大于8位的处理器,例如,16bit或者32bit宽度的处理器,由于寄存器的宽度大于1个字节,那么必然存在着如何将多个字节安排的问题,因此就有了大端模式和小端模式存储的区分。
2、实例
简单分析一些实例,例如,数据0x12345678在内存中的存储形式:
首先是大端模式存储,数据的高字节存储在内存的低地址端,数据的低字节存储在内存的高地址端,存储方式如下:
低地址--------------->高地址 0x12 | 0x34 | 0x56 | 0x78
而小端模式存储,则是数据的高字节存储在内存的高地址端,数据的低字节存储在内存的低地址端,存储方式如下所示:
低地址--------------->高地址 0x78 | 0x56 | 0x34 | 0x12
接下来,看看一个具体的例子,32bit宽度的数据0x12345678在大端模式和小端模式下,在内存中的存储形式,假设该数据从内存地址0x4000开始存储,如下:
内存地址 | 大端模式存储 | 小端模式存储 |
0x4000 | 0x12 | 0x78 |
0x4001 | 0x34 | 0x56 |
0x4002 | 0x56 | 0x34 |
0x4003 | 0x78 | 0x12 |
大端模式和小端模式存储,并没有谁优谁劣的说法,各自的优势便是对方的劣势,在小端模式下,强制转换数据不需要调整字节的内容,1、2、4字节的存储方式一样,大端模式下,符号位的判定固定为第一个字节,容易判断正负,一般操作系统为小端模式,而通讯协议为大端模式,对于ARM处理器,可以工作在小端模式,也可以工作在大端模式。
3、机器字节序判断
对于机器字节序的判断,可以通过编写一个简单的测试程序进行判断,如下:
#include <stdio.h> unsigned char IsBigEndian(void) { int a = 0x12345678; char b = *(char *)&a; /* 取出低地址保存的数据 */ if (b == 0x12) return 1; else return 0; } int main(int argc, char *argv[]) { unsigned char flag = IsBigEndian(); if (flag) printf("Big-Endian "); else printf("Little-Endian "); return 0; }
还有更多的判断方式判断,可以自行了解。
4、小结
本文简单总结了大端模式和小端模式这两种数据存储方式的理解。