你了解计算机中大端小端之分吗?

开发 前端
大端常常用于网络协议,被称为网络端序,大端用于网络协议,并不意味它比小端多好,而是网络的核心是通信,所以大家必须要有共同的标准,即网络通信的标准化。
  • 字节序
  • 大端字节序
  • 小端字节序
  • 判断当前设备大端or小端?
  • 尾语

哈喽,大家好,我是呼噜噜,前段时间感冒了,好久没更新文章了,今天我们来聊聊计算机储存方式大端小端字节序之分

在计算机中,无论上层是什么开发语言,到了最底层都是以二进制的形式存储运算的;二进制,与我们更熟悉的十进制(由0-9这九个数字组成,逢十进一)不同的是,只有0和1两个数字,逢二进一

如今的主流计算机,是以以储存器为中心,存储器是用来存放数据和程序,下面是架构图:

图片图片

存储器 包含主存和辅存,其中主存是能直接与CPU交换信息,就是我们熟悉的内存。

字节序

计算机以二进制的形式将数据存到内存中,内存的基本单位是字节Byte, 内存以字节为单位来进行读写 。1Byte = 8bit(bit叫位,也叫比特,是用以描述计算机数据量的最小单位)。字节是内存8位为一组,每组比特都会被标记一个数字,这个数字也叫地址,寻址粒度也是字节

一个字节由于8位,如果它只考虑无符号数,它的表示范围0~255;如果考虑符号,并通过补码解决0值的问题,只能表示-128~127这个范围;那么如果超出这个范围,只能将多个字节连在一起来表示数值。比如C语言中char类型是1个字节的,int类型占用4个字节,double类型会占用8个字节等等

那么多个字节依次存到内存中,就会有顺序,这个叫字节序Endianness,也被称为端序,就是 大于一个字节类型的数据在内存中的存放顺序

字节序可以被分为两类:Big-Endian大端和Little-Endian小端(这也意味着单个字节没有大小端之分的),我们下文详细聊聊

大端字节序

大端字节序Big-Endian:数值的高位字节存放在内存的低地址端,低位字节存放在内存的高地址端

本文这里以32位的数0x12345678,来举个例子

图片图片

该数值,在内存中的存储顺序是:0x12345678。大端字节序有符号数的最高位占据内存最低地址,符号位的判定固定在第1个字节处,符号直接可以取出来,容易判断正负;另外大端字节序更贴近从左到右的书写方式,所以更符合我们人类的习惯

大端常常用于网络协议,被称为网络端序,大端用于网络协议,并不意味它比小端多好,而是网络的核心是通信,所以大家必须要有共同的标准,即网络通信的标准化

所以在TCP/IP协议中,RFC1700规定使用大端字节序为网络字节序,如果使用小端的计算机,接发数据时需要自行将主机字节序转换为网络字节序

小端字节序

小端字节序Little-Endian:数值的低位字节存放在内存的低地址端,高位字节存放在内存的高地址端本文这里还是以32位的数0x12345678,来举个例子

图片图片

该数值,在内存中的存储顺序是:0x78563412。小端字节序最大的优点就是

小端字节序序最大的好处是强制转换数据类型效率较高,比如小数强制转大数只需要在高位添0;如果大数强制转小数,直接将高位数据丢弃即可,不需要额外再调整宇节

图片图片

而大端字节序则需要调整字节内容,移动数据

图片图片

在现代计算机中,大多采用小端字节序,比如x86、DEC VAX、PDP-11等等 当然也有采用大端字节序的,比如:IBM、Sun、PowerPC等处理器 另外ARM系列处理器,大小端字节序都支持,可配置

判断当前设备大端or小端?

可以写个小代码来快速判断,我们这里以C/C++语言为例:

BOOL IsBigEndian()
{
    union NUM
    {
        int a;
        char b;
    }num;
    num.a = 0x1234;
    if( num.b == 0x12 )
    {
        return TRUE;
    }
    return FALSE;
}

这里利用联合体union,所有成员共用同一块内存的特性,可以轻松地判断当前设备是否是大小端字节序

尾语

最后补充一个小故事,大端小端名词来源于Jonathan Swift书写的《格列佛游记》,书中描述了小人国,因为吃鸡蛋是从大头的一端剥开还是从小头的一端这个问题,导致教派之间的冲突,连年征战,死战不休

这是不是也暗示大端小端争论,并无较真的意义,怎么好用怎么来,通信交流做好转换的必要措施即可

到如今,从技术上来说,大小端的并无谁有明显的优势,更多的是计算机发展历史的影响。最初设计时,对字节序的选择往往是任意的,但后续技术的发展,需要背上兼容性的包裹。比如ARM明明大小端都支持,为啥大部分是小端,主要是移植x86程序方便;

还有RISC-V手册描述他们选择了小端序的原因:因为小端字节序,目前在商业上占主导地位(所有x86系统、iOS、Android和Windows for ARM)。想拓宽视野地可以去看看The RISC-V Instruction Set Manual Volume I: Base User-Level ISA

当然也有商业竞争的原因,Intel的x86选择小端(可能是为了躲避专利纠纷),最终击败了IBM,导致如今主机领域小端是主流

参考资料:

《深入理解计算机系统》

https://inst.eecs.berkeley.edu/~cs250/fa11/handouts/riscv-spec.pdf

https://www.spiceworks.com/tech/tech-general/articles/big-endian-vs-little-endian

责任编辑:武晓燕 来源: 小牛呼噜噜
相关推荐

2023-10-11 18:30:39

Web系统程序

2022-03-30 15:25:28

链接过程计算机系统程序

2021-12-10 06:52:23

计算机病毒安全

2018-10-08 14:10:46

2021-01-22 05:44:24

数据底层架构

2023-12-01 15:57:07

系统调用计算机

2021-01-27 14:18:17

量子计算传统计算量子机器

2018-08-24 10:35:49

物理内存存储

2011-07-05 13:11:45

2012-12-20 09:42:16

Linux超级计算机HPC

2015-07-31 10:35:18

实时计算

2013-11-07 14:32:41

Ubuntu技巧

2015-03-24 14:11:41

程序员

2012-04-16 14:58:42

2016-12-12 09:39:40

2009-06-25 09:01:42

Linux

2020-11-06 09:19:20

应用编译源代码

2021-04-15 11:43:53

C语言位域字节序

2017-07-14 15:40:28

2021-08-12 15:00:01

Linux终端
点赞
收藏

51CTO技术栈公众号