前言:
如今大家对“字节序大端小端”大约比较看重,咱们都需要学习一些“字节序大端小端”的相关资讯。那么小编也在网摘上网罗了一些关于“字节序大端小端””的相关资讯,希望各位老铁们能喜欢,朋友们快快来了解一下吧!首先看这样一段代码,这是在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方式称为网络字节序。
— 完 —