当前位置:网站首页 > 技术博客 > 正文

简述大端和小端字节顺序的区别



参考文章:

  • 阮一峰的网络日志:理解字节序(图片取自这里)
  • Wikipedia:Endianness
  • How to teach endian

在计算机中存在这样一个问题:如何表示各种各样的数据?

对于图片等文件来说,有固定的格式文档参考。

而对于整数来说,计算机应该如何表示?

它的定义一定包括整数的大小、是否带符号以及符号是什么、使用什么编码格式表示(一般都是二进制补码),还有很重要的一点:字节顺序

字节应该从右向左读还是从左向右读呢?

这种读取的顺序就称为:字节序(Byte-order / Endianness)

字节序分为两种:大端字节序(Big Endian,从左向右)和小端字节序(Big Endian,从右向左)

换句话说

大端字节序高位字节在前,低位字节在后

小端字节序低位字节在前,高位字节在后

从一个十六进制数字开始:

大端字节序是人类处理自然语言的做法,符合人类从左向右读的阅读习惯。

在这种规范下,十六进制数会先存储0x12作为高字节,接下来存储0x34。

低位字节在前,高位字节在后,也就是会以0x3412的形式存储。

字节序是以字节为单位定义的,在一个字节中,两个半字节仍然是以大端的形式存在。

为什么要区分字节序?这样复杂的意义是什么?

image

image

小端字节序对于逻辑电路更有效率。逻辑电路先处理低位字节更有效率,因为计算都是从低位开始的,计算机中的内部处理逻辑都是使用小端字节序。

但是,大多数的网络协议和文件格式都是大端字节序,这样对用户更加友好。

既然有区分,在使用时肯定要使用一定的解析规则,下面进行简要介绍。

对于大端字节序,计算机先读到的是高位字节,后读到的是低位字节。而小端字节序恰好相反。

字节序的处理:只有在读取的时候才需要区分字节序,其他情况都不需要处理。

处理器读取外部数据时,必须知道数据的字节序才可以将其转化成正确的值。接下来就可以正常使用这个值,不需要再考虑字节序。而向外部设备写数据的时候,也不需要考虑字节序,正常写入一个值即可,外部设备会自己处理字节序的问题。

例如,处理器读入一个16位整数

大端字节序会按照如下方法转值:

 
  

其中是整个数据块在内存中的起始地址,表示偏移量,也就是正在读取的位置。第一个字节乘以256,再加上第二个字节,就是大端字节序的值,这个式子可以用逻辑运算符改写。即:

 
  

编译器总是将乘2的幂转换成移位指令,这样更加方便!左移八位,即在后面添加8个0。

小端字节序会按照如下方法转值:

 
  

32位整数的求值公式也是一样的

 
  

                            

版权声明


相关文章:

  • dns中mx记录表示2025-07-23 07:01:03
  • 微信开发小程序appid2025-07-23 07:01:03
  • c单例模式的几种实现方式2025-07-23 07:01:03
  • qfile使用2025-07-23 07:01:03
  • 数据库基础学习2025-07-23 07:01:03
  • 网络调试助手原理2025-07-23 07:01:03
  • kvm虚拟化技术是什么2025-07-23 07:01:03
  • java多线程简单实例2025-07-23 07:01:03
  • 在oracle中游标都具有哪些属性2025-07-23 07:01:03
  • uml怎么画流程图2025-07-23 07:01:03