大端法和小端法字节序列

在操作系统中,一个内存单元大小为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.png

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

小端

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


2.png

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

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

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


3.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 6,325评论 0 7
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 8,743评论 0 6
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,871评论 6 13
  • 简介 在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如在C语言中,一个类型为int的变量x地址为0x1...
    啤酒找尿布阅读 5,498评论 0 2
  • 二、天门山探险 张家界的行程8月25日正式开启。 是日,晨八时从长沙出发,乘大巴往张家界。 车行至五一大道,导游介...
    铁妩阅读 4,189评论 69 35