字节序&比特序
1. 字节序——大小端
1.1 简介
大端(Big-Endian): 数据高字节——>低位地址,数据低字节——>高位地址;
小端(Little-Endian): 数据高字节——>高位地址,数据低字节——>高位地址;
防止记混了可以只记住小端是高对高,其他的自己可以推出来;
或者你可以记住大端模式符合我们的阅读习惯(至于怎么符合,看下图);
插一句,小端模式其实是符合我们的逻辑思维,低字节放在低地址,高字节放在高地址(emmm…怕记混了当我没说>_<)
注1:计算机在内存中存放数据的顺序都是从低地址到高地址,大小端的差异只是体现在首先取低字节的数据存放在低地址还是取高字节的数据存放在低地址;此外,所谓的大小端只是数据在存储时的表现,而非在寄存器中参与运算的表现;
常用的x86结构都是小端模式,而大部分DSP,ARM也是小端模式,而KEIL C51则为大端模式;
1.2 图示
举个栗子,当我们存放一个数据为int类型时,他需要占用4个字节,如图所示,int a = 0x12345678, &a = 0x0042ff11(懂意思就好,&a是不能做左值的,演示所用,勿喷),那么这个a在内存中到底如何存放呢?
如上图,现在应该可以明确感受到所谓的大端模式符合我们的阅读习惯了吧
注2:只有多字节数据存储时才会考虑大小端,如果一个数据只占一个字节,比如char类型的字符,那这个字节的内存中就保存字符对应的ASCII码。当然,大小端的出现不仅仅是因为多字节数据的存储问题,还有一个原因是:处理器的差异性,对于16/32位的处理器,由于寄存器的宽度大于一个字节,那么必然存在一个如何将多个字节安排的问题。
这里顺带提下,int、char等数据类型是告诉编译器从内存的某个地址开始读几个字节的数据,比如char类型是读一个字节,int类型是4个字节,当然了,有些类型在32/64位的机器上不一样,这里就不展开讨论