一、大端与小端的概念
大端与小端是用来描述多字节数据在内存中的存放顺序,即字节序。
- 大端(Big Endian)是指低地址端存放高位字节;
- 小端(Little Endian)是指低地址端存放低位字节。
举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:
1.大端模式:
低地址 —————–> 高地址
0x12 | 0x34 | 0x56 | 0x78
2.小端模式:
低地址 ——————> 高地址
0x78 | 0x56 | 0x34 | 0x12
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元
Big Endian:符号位的判定固定为第一个字节,容易判断正负。
Little Endian:长度为1,2,4字节的数,排列方式都是一样的,数据类型转换非常方便。
需要记住计算机是以字节为存储单位。
不同的CPU架构有不同的选择,有的使用大端序存放整型、长整型;有的使用小端序存放整型、长整型。
x86架构的CPU都使用小端序,即低位字节放在前面。而POWER PC使用大端序。
一个整型数在网络中传输时,也有字节排序的问题。这是个约定俗成的问题。网络字节序就是big-endian,即排在前面的字节是高位字节。
二、如何判断大端和小端
怎么判断自己使用的机器是大端序还是小端序呢?使用下面的C程序:
#include <stdio.h>
int main(int argc, char *argv[])
{
int i = 1;
char *p = (char*)&i;
if(p[0] == 1) {
printf("little endian\n");
}
else {
printf("big endian\n");
}
return 0;
}
原理是取整型数1的第一个字节。如果是小端序存放,即低位字节在前,那这个字节的值一定是1;否则是0。