#埃尔法哥哥#自制编程语言2.2什么是字节序


本系统中很多地方都用大端字节序来写数据 , 因此单独介绍下字节序 , 先熟悉啊为什么会产生字节序的问题 。
内存是以字节为单位读写的 , 其最小的读写单位就是字节 , 故如果在内存中只写入一个字节 , 一个内存的存储单元便可以将其容纳了 , 只要访问这一块内存地址就能够完整的取出这1字节 , 可是1字节要能够标识的范围只有0-255 , 超过这个范围的数只好用多个字节连在一起标识 , 因此我们的32位程序中 , 定义的数据列席很多 , 一字节的数据类型只有char , 像int型占用4个字节 , double型占用8个字节 , 正如解决了一个问题又抛出了新的问题 , 解决了数值范围的问题 , 那带来的新的问题就是这多个字节该以怎么样的顺序排放呢 , 一个超过255的数字必然要占用2个以上 , 这两个字节 , 在物理内存中 , 那个在前 , 哪个在后 , 拿0x1234来说 , 数值汇总的高12位是存放在内存中的高地址还是低地址?
为什么要强调这个顺序呢?因为这涉及CPU得知现货的的部分数据是属于高字节还是低字节 , 原因是读取内存呢数据的动作既是随机又是线性 , 随机是指内存是个随机存取设备 , 可以跳转到任意位置去读写数据 , 线性是指你内存读取是从低地址向高地址方向 , 像根线一样 , 加入给出了某个变量的内存地址后 , 数据寻址操作是以该地址为最低地址 , 顺着此地址往高地址方向读取一定偏移量的数据 , 此偏移量正是该变量的数据类型占用的字节数 , 这样才获得了数据 , 既然内存是从低地址向高地址方向线性发展 , 对于2字节以上的数据 , 那么从低地址往高地址读的过程中 , 先遇到的是数据的高字节还是低字节呢 , cpu得知道获得的数据的哪个部分 , 否则连这个都分不清的话 , 像位移这种操作肯定会乱的 , 于是就产生了这两种相反的排列顺序 。
【#埃尔法哥哥#自制编程语言2.2什么是字节序】(1)小端字节序 , 是数值低字节存放在内存的低地址处 , 数值高的字节放在内存的高地址 , 典型的代表x86架构的CPU , 如intel和amd 。
(2)大端字节序 , 是数值的低字节放在内存的高地址处 , 数值的高字节放在内存的低地址 , 典型的代表是IBM sun
总结 , 从低地址往高地址读写内存的过程中 , 先遇到的是数据的哪部分就是哪种字节序 , 先遇到的是高字节就是大端字节序 , 先遇到的低字节就是小端字节序 。
字节序只是规定了数据的高低字节的写入顺序 , 尽管字节序最初来自于CPU硬件的需求 , 但是后来网络传输 , 编码 , 同步数据的场景也遇到了2、字节以上的数据类型拆分传输的问题 , 所以字节序的场景并不专指CPU , 软件中读写超过1字节的数据类型时也会涉及字节序的概念 。

#埃尔法哥哥#自制编程语言2.2什么是字节序
本文插图


    推荐阅读