内存是以字节为单位读写的,其最小的读写单位就是字节。故如果在内存中只写入 1个字节,1 个内存的存储单元便可将其容纳了,只要访问这一内存地址就能够完整取出这1字节。
常见 CPU 的字节序如下:
(1)大端字节序: IBM 、Sun 、PowerPC
(2)小端字节序: x86 、DEC
ARM 体系的 CPU 则大小端字节序通吃,具体用哪类字节序由硬件选择。
【补充】网络字节序就是大端字节序,所以在 x86 架构上的程序在发送网络数据时,要转换字节顺序。
Big-Endian和Little-Endian的定义如下:
Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
Big - Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
画个图,更好理解一下
(1) 大端模式:
低地址 --------------> 高地址
| 地址 | 0x100 | 0x101 | 0x102 | 0x103 |
|---|---|---|---|---|
| 数值 | 01 | 02 | 03 | 04 |
(2) 小端模式:
高地址 --------------> 低地址
| 地址 | 0x100 | 0x101 | 0x102 | 0x103 |
|---|---|---|---|---|
| 数值 | 04 | 03 | 02 | 01 |
#include
int main()
{
int value = 1;
if (((char*)&value)[0]) {
printf("Little endian\n");
}
else {
printf("Big endian\n");
}
return value;
}

解释:
(*(char*)&value):&value取出value的在内存中的地址,int型为4个字节.
如果用内存表示的话,可以分为2种情况
1.小端储存
[1000][0000][0000][0000]
2.大端储存
[0000][0000][0000][1000]
之后强制类型转换为char* ,char指针只能取出一个字节的值
接着判断是0还是1.
如果是1,那么就是小端储存。否则是大端储存。
#include
using namespace std;
int arr(){
union{
int i;
char c;
}un;
un.i = 1;
return un.c;
}
int main(){
int x =arr();
if (x== 1){
printf("小端");
}
else{
printf("大端");
}
return 0;
}

解释:
由于共用体的特性i与c共用一块内存。
其中i为int 型占4个字节,c为char型1个字节;
那么就转化为方法一的判断了
如果用内存表示的话,可以分为2种情况
1.小端储存
[1000][0000][0000][0000]
2.大端储存
[0000][0000][0000][1000]
接着判断是0还是1.
如果是1,那么就是小端储存。否则是大端储存。
参考资料:
《操作系统真象还原》