一.大小端的含义
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位
,
,保存在内存的高地址中。
例如,变量int a,&a=0x1234,那么12就是数据的高位,而34就是数据的地位,因此,在大端存储模式下,该数据保存为0x1234,,小端存储下,保存为0x3412,如图。
![](https://img-blog.csdnimg.cn/direct/b2201deb24544a2e859d59e589d779a3.png)
二.存在原因
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为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
处理器还可以由硬件来选择是大端模式还是小端模式。
三.判断方法
1.代码和运行结果如下
由于int类型的数据采用补码方式存储,所以i=1.实践上就是0x00 00 00 01,那么我们首先对其进行强制类型转换为char*,再解引用,只访问一个字节。那么如何区分大端和小端,就是看得到的是0还是1了。
2.代码和运行结果如图
这里我们采用联合体,让int i和char c共用4个字节的空间,并令i=1,由于c和i共用一个字节的空间,所以可以通过判断c是0还是1的方式来判断大小端。