C语言中数据是存储在内存中的,而内存空间又被划分为以字节为单位的连续地址空间,那么,我们定义的变量是在内存中如何存储的呢。
我们把变量在内存中的存储分为两种,大端字节序存储与小端字节序存储。
1. 小端字节序存储
数据的低字节存储在低地址处,高字节存储在高地址处。
2. 大端字节序存储
数据的低字节存储在高地址处,高字节存储在低地址处。
3. 为什么会有⼤⼩端模式之分
这是因为在计算机系统中,我们是以字节为单位的,每个地
址单元都对应着⼀个字节,⼀个字节为8bit。
但是在C语⾔中除了8bit的char之外,还有
16bit的short型, 32bit的long型(要看具体的编译器),另外,对于位数⼤于8位的处理
器,例如16位或者32位的处理器,由于寄存器宽度⼤于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。
因此就导致了⼤端存储模式和⼩端存储模式。例如⼀个16bit的
short型x,在内存中的地址为0x0010, x的值为0x1122,那么0x11为值的⾼字节, 0x22为值的低字节。
对于⼤端模式,就将0x11放在低地址(0x0010)中, 0x22放在⾼地址(0x0011
)中。⼩端模式,与之相反。
我们常⽤的X86结构是⼩端模式,⽽KEIL C51则为⼤端模式。很
多的ARM, DSP都为⼩端模式。有些ARM处理器还可以由硬件来选择是⼤端模式还是⼩端
模式。
4. 判断大小端存储方式
那了解完了存储的方式,那我们怎么区分所使用机器是大端存储还是小端存储呢,接下来我们设计一个程序来区分机器是何种字节序存储。
```
// plan 1 普通方法
int check_sys1() {
int a = 1;
return *(char*)&a;
/*
返回0,大端模式
返回1,小端模式
*/
}
// plan 2 利用联合
int check_sys() {
union Un {
char c;
int i;
}u;
u.i = 1;
return u.c;
}
int main(){
int a = 1;
int ret = check_sys1();
// ret = check_sys2();
if(ret == 1) {
printf("小端\n");
} else if(ret == 0) {
printf("大端\n");
}
return 0;
}
对于联合的概念不清楚的可以参考