一. 大端模式:一个数据的高位字节储存在内存的低地址端,而低位字节储存在内存的高地址端
小端模式:一个数据的低位字节储存在内存的低地址端,而高位字节存储在内存的高地址端
假设数组char a[2] = 0x0102 这里01是该数据的高位,02是该数据的低位
如图所示:
二.操作系统在访问内存数据的时候,是从低地址端向高地址端有顺序的进行,所以大端模式是从高位字节开始,而小端模式是 从低位字节开始。但是若是从磁盘上读取数据,由于磁盘的数据实际是按字节存储的,所以读取还是从高位开始。
三.关于怎么判断系统是大端模式,还是小端模式。
思路:
可以利用union联合体的特性:union联合体里面的成员共享同一片储存区域
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
union a{
short a;
char b[2];
};
int main()
{
union a p;
p.a=0x0102;
if(p.b[0] == 2 && p.b[1] == 1) //数据的低位在内存地址的低位
{
printf("little__endian\n");
}
else if(p.b[0] == 1 && p.b[1] == 2) //数据的高位在内存地址的低位
{
printf("big_endian\n");
}
printf("&p.b[0]=%p &p.b[1]=%p\n",&p.b[0],&p.b[1]);
printf("p.b[0]=%d p.b[1]=%d\n", p.b[0],p.b[1]);
}
运行结果:
little_endian
&p.b[0]=0x7fffdd59c086 &p.b[1]=0x7fffdd59c087
p.b[0]=2 p.b[1]=1