龙空技术网

什么是大端序和小端序?

张记代码铺 83

前言:

如今大家对“字节序大端小端”大约比较看重,咱们都需要学习一些“字节序大端小端”的相关资讯。那么小编也在网摘上网罗了一些关于“字节序大端小端””的相关资讯,希望各位老铁们能喜欢,朋友们快快来了解一下吧!

首先看这样一段代码,这是在java.nio.Bits类中的一段代码:

java.nio.Bits

让我们先来跑跑看结果是什么。

Field field = Unsafe.class.getDeclaredField("theUnsafe");field.setAccessible(true);Unsafe unsafe = (Unsafe) field.get(null);ByteOrder byteOrder;long a = unsafe.allocateMemory(8);try {    unsafe.putLong(a, 0x0102030405060708L);    byte b = unsafe.getByte(a);    switch (b) {        case 0x01: byteOrder = ByteOrder.BIG_ENDIAN;     break;        case 0x08: byteOrder = ByteOrder.LITTLE_ENDIAN;  break;        default:            assert false;            byteOrder = null;    }} finally {    unsafe.freeMemory(a);}System.out.println(byteOrder);

运行结果如下:

运行结果

它在干什么?

它在判断当前的CPU是大端序还是小端序!那么具体的含义是什么呢?

Jonathan Swift在1726年写的讽刺小说《Gulliver's Travels》(格利佛游记)中,

在描述Gulliver畅游小人国时碰到了如下的一个场景:在小人国里的小人因为非常

小(身高6英寸)所以总是碰到一些意想不到的问题。有一次因为对水煮蛋该从大的

一端(Big-End)剥开还是小的一端(Little-End)剥开的争论而引发了一场战争,

并形成了两支截然对立的队伍:支持从Big-End剥开的人Swift就称作Big-Endians

而支持从Little-End剥开的人就称作Little-Endians……(后缀ian表明的就是支持

某种观点的人)。Endian这个词由此而来。1980年,Danny Cohen在其著名的论文《On Holy Wars and a Plea for Peace》中为平息一场关于字节该以什么样的顺序传送的争论而引用了该词。

字节存储顺序主要分为大端序(Big-endian)和小端序(Little-endian)

Big-endian:高位字节存入低地址,低位字节存入高地址Little-endian:低位字节存入低地址,高位字节存入高地址

例如我们要存入一个十六进制数字0x1A2B3C4D,那么在内存中的存储方式如下图所示:

有了基本概念,上面的代码便不难理解了:

首先申请了8个字节的内存空间再将长度为8 Byte的long型数字放入内存然后取第一个字节如果是大端序,第一个字节应该是0x01否则是0x08最后释放内存空间

一般来说,x86系列CPU都是Little-endian字节序,PowerPC通常是Big-endian字节序。

那么,为什么有大小端之分

计算机中电路优先处理低位字节,效率比较高,因为计算机都是从低位开始的,所以计算机内部处理都是小端字节序。

但是我们平常读写数值的方法,习惯用大端字节序,所以除了计算机的内部,其他场景大都是大端字节序,比如:网络传输和文件储存时都是用的大端字节序,所以有时也把Big-endian方式称为网络字节序

— 完 —

标签: #字节序大端小端 #大小端 字节序