字节序有两种:大端序、小端序,我们日常使用的系统(Linux、Windows)都是以小端顺序存储字节
看一个检查大小端的例子
#include <stdio.h> int main() { short int a = 0xAABB; // 1010 1010 | 1011 1011 char *p = &a; int arr[3]; arr[1] = *p; // 1010 1010 arr[2] = *(p + 1); // 1011 1011 if (arr[1] == 0xAA) { printf("is big endian\n"); } else { printf("is little endiam\n"); }
return 0;
}
代码中十六进制0xAABB可表示两个字节,其中AA是高位,BB是低位
a是短整型占2字节,用字符型char(占1字节)将a分割成AA和BB两块。如果本机是按大端排序的话,AA作为高位应该放在低地址区,即指针p所指的a的起始位置。相反如果是小端序,低地址位应存储地位BB
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低