为什么存储的顺序有些变动呢?
大小端的介绍
我们在创建变量时,操作系统就会给你分配空间,比如你创建了【short/int/double/float】的变量,这些变量的类型都是大于1个字节的,操作系统会根据你这个变量的类型,分配相应的内存空间,在空间分配好之后,在这块内存中进行存储这个变量,反正内存已经分好了,所以在这个内存中如何存储就不关操作系统的事情了。那么这个变量在它内存存储中,是从低地址到高地址呢?还是从高地址到低地址呢?
在一块给定的内存中,其实在内存中存储的时候,其实顺序是可以任意的。只要以你的方式存储进去,关键的是在你需要使用数据的时候,以你的方式原样返回即可。
简而言之,怎么存储其实并不重要,重要的是,你能够存进去并且取出来即可。
如下图,假设int a = 0x11223344,其实下面的这类种存储方式都是可以的,但是因为像类似下面这两个存储方式,在读取的时候,是极其不方便的,所以这之后的C语言发展的过程中,就将类似于下面的存储方式就不再继续使用了,最后就采用了这两种存储方式,一种是正着存储,一种是倒着存储。
这里这就分为了两种存储方式,大端字节序存储和小端字节序存储。
大端字节序存储
大端字节序存储,就是将一个数据的低位字节处的数据存储到内存中高位字节的存储数据,将这个数据的高位字节处的数据存储到内存中低位字节的存储数据。
小端字节序存储
小端字节序存储,就是将一个数据的高位字节处的数据存储到内存中高位字节的存储数据,将这个数据的低位字节处的数据存储到内存中低位字节的存储数据。
而这里注意,在数据类型为char时,就不需要考虑存储顺序的问题,因为char类型的数据只占1个字节。
只有所占的字节数大于1字节的时候,比如short、int、double、float、long long等,我们才考虑存储顺序的问题。
那么为什么会出现大小端字节序的存储问题呢?
因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一字节为8比特位。但是在C语言中,除了有8比特位的char,还有16比特位的short,32比特位的long(具体需要根据编译器)。另外,对于16位、32位的处理器,由于寄存器是大于一个字节的,那么必然就会存在着如何将一个多字节存储安排的问题,这便导致了会有大小端字节序存储之分。
在学习完了大小端字节序存储之后,这里有一道关于它的笔试题:
百度在2015年系统工程师的笔试题
请简述大端字节序存储和小端字节序存储的概念,并设计出一个程序来判断当前机器的字节序。
思路:
假如我们存储了int a=0,那么a的16进制就是0x 00 00 00 01。在这个数据中,01方向的是低位数数据,00方向的是高位数数据。那么,在这种情况下存储1,假设是小端字节序存储(高位数数据存储到高地址中),那么就是01存储到了高地址中,那么只要验证出低地址中取出的数等于1的话,那么就可以说明它就是小端字节序存储。如图:
代码:
#include <stdio.h>
int main()
{
int a = 1;
char* p = (char*)&a;//利用char类型1字节,来判断存储在低地址种的一字节的数据是何值
if (*p == 1)
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}