目录
什么是大小端存储?
字节序的概念:
小端字节序存储:
大端字节序存储:
什么是低位字节、高位字节?
记忆技巧:
C语言求证大小端存储
法一:
法二:
总结:
什么是大小端存储?
大致的理解就是数据在内存中存储字节序的顺序·。
字节序的概念:
是以字节为单位,讨论存储顺序的。
小端字节序存储:
把一个数据的低位字节的内容放到低地址处,把一个数据的高位字节的内容放到高地址处。
大端字节序存储:
把一个数据的低位字节的内容放到高地址处,把一个数据的高位字节的内容放到低地址处。
什么是低位字节、高位字节?
比如一个整数123,个位数3就是低位,百位数1就是高位。
低位字节也同理,比如一个十六进制0x11223344,11就是高位字节,44就是低位字节。
画个图理解一下
记忆技巧:
在文字层面上,大端字节序存储是倒着存的,因为低位字节放到了高地址处,高位字节的内容放在了低地址处,文字层面上理解是倒着存。
在形式层面,小段字节序是倒着存,因为本来数据0x11223344,我们从小端存储模式拿出来却是0x44332211,这样看从形式上就是倒着存的。
但一般而言我们直接看形式,因为形式上更直接,看到在形式上是倒着存的,那么就是小端存储。
C语言求证大小端存储
法一:
我们假设有一个整型1,在内存中按照字节序的存储就是 00 00 00 01,我们只需要知道存在低地址中的到底是00 还是 01,这是一个字节的内容,而访问一个字节的内容,需要用到char*
所以我们直接将这个整型强制类型转换为char,然后取地址访问第一个字节的内容,即可知道大小端存储的顺序。
源码:
int main()
{
int i = 1;
int ret = *((char*)&i);
if (ret)
printf("是小端存储");
else
printf("是大端存储");
return 0;
}
法二:
利用联合体的性质,联合体内部成员变量共用同一块空间,那我们还是那个思路先定义整型1,然后定义一个char类型,因为共用同一块空间,所以直接访问char类型,看是1还是0即可判断。
源码:
union un
{
int i;
char a;
};
int main()
{
union un a = { 0 };
a.i = 1;
if (a.a == 1)
{
printf("小端存储");
}
else
{
printf("大端存储");
}
return 0;
}
总结:
上面的两种方法底层逻辑是一样的,都是想从定义整型1的4个字节内容里面访问第一个字节的内容,看是不是1,就可以判断出来大小端存储。