什么是大小端:
以int类型为例,C语言中一个int占4个字节,而内存中的存储是以按字节为单位的,那么就存在一个顺序的问题,无非就是按顺序存放,或者按倒序存放嘛。这里所说的大小端字节序简单来讲就是字节在内存中的存放顺序。大小端分别是什么规则呢?
- 大端字节序:把一个数据的低位字节内容放在高地址处,高位字节内容放在低地址处
- 小端字节序:把一个数据的高位字节内容放在高地址处,低位字节内容放在低地址处
如图所示,假设在内存中一个数据是 0x11223344 因为一个字节是八位,一个十六进制位表示四个二进制位,所以如果按 11 22 33 44 存,就是低字节在高地址,高字节在低地址的大端字节序,如果按 44 33 22 11 存,就是低字节在低地址,高字节在高地址的小端字节序。
查看:
接下来我们通过Visual Studio 2022观察一下我的电脑的数据是怎么存的。请看图!
a=10写成32位二进制序列是00000000 00000000 00000000 00001010 的十六进制是00 00 00 0a我们可以看到在这里 a 的低字节内容 0a 在低地址处,因此是小端存储。
上图怎么来的?按 F10(Fn+F10)-> 调试 -> 窗口 -> 内存 -> 随便选一个 -> 输入&a 就可以观察a的地址的变化。
写一个判断大小端的函数:
#include<stdio.h>
int CheckSys()
{
int a = 1;
char* ret = (char*) & a;
if (*ret == 1)
return 1;
else
return 0;
}
int main()
{
int ret = CheckSys();
if (ret == 1)
printf("小端\n");
else if (ret == 0)
printf("大端\n");
return 0;
}
解释一下 ChackSys函数:
a=1 的 32位二进制序列是 00000000 00000000 00000000 00000001,如果是大端字节序则00000001 低字节存在高地址处,如果是小端字节序则 00000001 低字节存在低地址处,因此只需要拿出 a 的地址来看它存的第一个内容是什么就能判断到底是大端还是小端。
但是一个整型是四个字节怎么单独看它的第一个字节的内容呢,这时就需要用到char类型的指针来保存a的地址,因为char类型占一个字节,用char类型指向a的地址,再解引用,就只能看到那一个字节的内容,再判断这个内容,就很容易得到结果。