大端法和小端法字节序列

在操作系统中,一个内存单元大小为8bit,也就是1byte。每个内存单元都有它的逻辑地址,64位编译环境下,地址占用,但由于系统限制,其实只用到了48位,所以经常会看到打印一个指针,出现的值是一个小于等于48位长度的十六进制值,但存储这个指针仍占用64位(8bytes)的内存空间。

    int i = 254;
    int * p = &i;
    printf("%p\n",p);        //打印指针p保存的地址值
    printf("%d\n",siezeof(p)); //打印指针p所需要的内存大小

打印结果为0x7ffc8e034154和8。

如果一个存储对象所需要存储的空间能被一个内存单元(1byte)容纳,那么就能直接存入一个内存单元中,比如:char类型的数据对象。
如果一个存储对象所需要的存储空间大于1byte,那么它将会被连续地存储在多个内存单元中。这个时候就要分大端和小端的字节序列存储方式。

声明一个32位无符号整型变量,它存储时需要占据4个内存单元。
uint32_t num = 1261859
num的二进制表示为00000000 00010011 01000001 00100011
num的十六进制表示为0x00134123
它的大小端存储方式表示如下:

大端

顺序存储对象的最高有效字节(注意是字节)存储在该内存段的最低地址中,最低有效字节存储在内存段的最高地址中。如图0x00134123在内存单元中的小端存储示意:
内存地址0x101是4个内存单元中的最低地址处。0x104是4个内存单元中的最高地址处。


大端法和小端法字节序列_第1张图片
1.png

根据权重比可知,00000000是最高有效字节(注意是字节,8位),00100011是最低有效字节,也就是说十六进制表示法中00是最高有效字节,23是最低有效字节,因此按从高字节到低字节顺序存储,会出现以上结果。这就是大端法。

小端

小端法和大端法截然相反,最高有效字节储存在该段内存的最低地址处,最低有效字节存储在最高地址处。结果如图:


2.png

常用的操作系统中,linux和windows是小端法来存储数据对象的。
那么如何查看自己的操作系统是用的大端还是小端法来存储数据对象的呢?
可以用一个简单的c程序或者其他程序来实现验证,我这里用c程序做例子:

#include 
#include 
int main(){
    uint32_t num = 1261859;
    unsigned char * order = (unsigned char *)#       //将num的首地址赋值给order作为无符号字符数组的首地址
    for (int i = 0; i < 4; ++i) {
        printf("%#.2x\t",order[i]);
        printf("%p\n",order+i);
    }
}

我的操作系统是linux deepin 64位,打印结果如下:


3.png

证明它用的小端法来存储数据对象。
注意:网络字节序列都是大端法表示。

你可能感兴趣的:(大端法和小端法字节序列)