字节序的理解
前言
最近一直在看《深入理解计算机系统》补充基础知识,看到有关介绍大端小端的介绍,下面就做个总结。
详细
- 大端:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。(符合我们平时的读写字符数值)
- 小端:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
举例:如数组0x2356,高位为:0x23 低位为:0x56,在内存的存放如下。
内存地址 | 小端模式 | 大端模式 |
---|---|---|
0x5000 | 0x56 | 0x23 |
0x5001 | 0x23 | 0x56 |
为什么会有大小端模式之分?
因为计算机系统中是以字节为单位的,每个地址单元都对应着一个字节,一个字节为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都为小端模式。
摘自百度百科
程序中大端小端判断
## 方法一
int i = 1;
char *p = &i;
if(*p == 1)
printf("little-endian");
else // (*p == 0)
printf("big-endian");
## 方法二 借助union联合体,由于联合体存放顺序是所有成员按照低地址存放。
int checkCPUendian()
{
union {
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
}
结果:1 --> little-endian 0 --> big-endian