对于16位、32位等位数更高的处理器,由于寄存器宽度大于1字节,必然存在如何安排多字节的问题,因此导致了大端存储模式(big-endian)和小端存储模式(little-endian)的产生。
大小端模式在处理器访问内存时用于描述寄存器的字节顺序和内存中的字节顺序之间的关系。
如一个16位的short类型变量X在内存中的地址为 0x0010,X的值为0x1122,其中,0x11为高字节,0x22为低字节。
- 对于大端模式,就将0x11(高位)放在低地址中,将0x22(低位)放在高地址中。
- 对于小端模式,就将0x11(高位)放在高地址中,将0x22(低位)放在低地址中。
很多的 ARM 处理器默认使用小端模式,有些 ARM 处理器还可以由硬件来选择是大端模式还是小端模式。Cortex-A 系列的处理器可以通过软件来配置大小端模式。
如何判断处理器是大端模式还是小端模式?
使用联合体(union),其存放顺序是所有成员均从低地址开始存放,利用该特性可以轻松判断 CPU 对内存采用大端模式还是小端模式读写。
c
#include <stdio.h>
bool checkCPU(void)
{
union w
{
int a;
char b;
}c;
c.a = 1;
return (c.b==1);
}
int main()
{
printf("%d\n", checkCPU());
return 0;
}
以上代码如果输出1则说明为小端模式(低字节存到高地址),否则为大端模式(低字节存到了低地址)。