知识点-大端和小端
参考文献
计算机中“大端”“小端”是指什么
-
大端小端真正引入计算机领域,是来自于一位网络协议的早期开创者Danny Cohen,他第一次使用这两个术语指代字节顺序,后来慢慢被大家广泛接受.
-
字节顺序说的到底是什么,先复习一个基础知识:
-
位(bit): 计算机中的最小数据单位,计算机存储的都是二进制0和1.
-
字节(Byte): 字节是存储空间的基本计量单位,也是内存的基本单位,也是编址单位.例如,一个计算机的内存是4GB,就是该计算机的内存中共有4×1024×1024×1024个字节,意味着它有4G的内存寻址空间.
-
-
换算关系:
-
1 GB = 1024 MB
-
1 MB = 1024 KB
-
1 KB = 1024 Bytes
-
1 Byte = 8 bits
-
-
【Q】: 思考一个问题,通常描述32位二进制数据,为什么是用8个十六进制数呢?如
0x1A2B3C4D
- **【A】: **十六进制(hex)是一种逢16进1的进位制.十六进制的数码有1,2,3,4,5,6,7,8,9,A(10),B(11),C(12),D(13),E(14),F(15).
-
**第一种理解: **
-
4个二进制bit 表示的数值范围是从0000~1111,即0~15, 刚好等同于 一位 16进制数的数值范围0~F(15).
-
所以可以类推得出:
-
1Byte = 8bit;即1个字节包含8个二进制bit,8个二进制bit对应需要2位十六进制数来表示(最大值为 0xFF);
-
4Byte = 32bit; 即4个字节包含32个二进制bit,32个二进制bit对应需要8位十六进制数来表示;(最大值为 0xFFFFFFFF);
-
-
-
**第二种理解: **
-
因为16=2^4(2的4次方),所以1位十六进制数可以转化为4位二进制数,即十六进制的每个字符需要用4位二进制位来表示,如0x0为0000,0xF为1111,即1个16进制数为4位二进制bit.
-
所以反推32位二进制数换算为十六进制数后的位数就变为32÷4=8位,即32位二进制地址信息需要8位十六进制数表示.
-
-
**总结下: **
-
4个二进制位(bit)(不够表示一个字节) = 1个十六进制(hex).
-
8个二进制位(bit) = 一个字节(Byte) = 2个十六进制(hex).
-
32个二进制位(bit) = 四个字节(Byte) = 8个十六进制(hex).
-
-
所以针对一个32位的数值,如0x1A2B3C4D,总共四个字节,两个十六进制数表示一个字节,高位字节为0x1A,低位字节为0x4D;中间两个字节分别为0x2B和0x3C;
-
数值0x1A2B3C4D想要在计算机中正确使用,就必须要考虑在内存中将其对应的四个字节合理存储.假设内存的地址都是从低到高分配的,那么对于一个数值多个字节顺序存储就有两种存储方式:
-
方式一、数值的高位字节存放在内存的低地址端,低位字节存放在内存的高地址端:
1
2
3
4
5内存低地址 --------------------> 内存高地址
0x1A | 0x2B | 0x3C | 0x4D
高位字节 <-------------------- 低位字节 -
方式二、数值的低位字节存放在内存的低地址端,高位字节存放在内存的高地址端:
1
2
3
4
5内存低地址 --------------------> 内存高地址
0x4D | 0x3C | 0x2B | 0x1A
低位字节 --------------------> 高位字节
-
-
**方式一 ,**我们就称之为 大端模式;即高位字节放在内存的低地址端,低位字节放在内存的高地址端.
-
**方式二 ,**我们就称之为 小端模式;即低位字节放在内存的低地址端,高位字节放在内存的高地址端.
-
**总结下: **
-
大端小端是不同的字节顺序存储方式,统称为字节序;
-
大端模式,是指数据的高字节位 保存在 内存的低地址中,而数据的低字节位 保存在 内存的高地址中.这样的存储模式有点儿类似于把数据当作字符串顺序处理: 地址由小向大增加,而数据从高位往低位放.和我们”从左到右“阅读习惯一致.
-
小端模式,是指数据的高字节位 保存在 内存的高地址中,而数据的低字节位 保存在 内存的低地址中.这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致.
-
**记忆小技巧: **
- 大端模式: “【低位】字节却硬要存在【高】地址中“.—“低对高(或高对低),门不当户不对,真令人头大”,记作大端模式.
- 小端模式: “【低位】字节正好存在【低】地址中”.— “低对低,门当户对,你侬我侬”,记作小端模式.