每个程序员都应当知道的“大小端”

概述

机器是分大小端的,这对我们编程有什么影响呢?什么又是大小端呢?也许我们很多时候都不清楚,但仍然可以很好地使用电脑,或者编写代码。但我认为《圣经》里有句话说得很好,“你应该了解真相,真相会使你自由”。
所以这次,我要揭开“字节端”的面纱,共享科学之美。

小故事

Jonathan swift在1726年写的讽刺小说《格列佛游记》,小人国的内战就源于吃水煮鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生6次叛乱,其中一个皇帝送了命,另一个丢了皇位。
这就是Endian的由来。

大小端应用领域

各个体系的计算机通常采用的字节存储机制主要有两种:大端(Big-Endian)和小端(Little-Endian)

Little-Endian主要用于现在的pc机上,比如Intel的x86系列;Big-Endian主要指PowerPC系列处理器。

另外,目前的TCP/IP网络及Java虚拟机的字节序都是Big-Endian的,这意味着如果通过网络传输0x12345678这个整型变量,首先被发送的应该是0x12,接着0x34,0x56,0x78。所以我们的程序在处理网络流的时候,必须注意字节序的问题。

大小端原理

MSB:Most Significant Bit/Byte,译为最重要的位或最重要的字节。
用来表明在一个bit序列(1byte是8个bit组成的序列)或一个byte序列(1word是2个byte组成的序列)中对整个序列取值影响最大的那个bit/byte。
LSB:Least Significant Bit/Byte,译为最不重要的位或最不重要的字节。
用来表明在一个bit序列(1byte是8个bit组成的序列)或一个byte序列(1word是2个byte组成的序列)中对整个序列取值影响最小的那个bit/byte。

举个栗子

一个十六进制的整数:0x12345678
0x12就是MSB,0x78就是LSB。
而对于0x78这个字节,它的二进制值0x01111000,那么最左边的0就是MSB,最右边0就是LSB。

Big-Endian

Big-Endian其实就是规定MSB在存储时放在低地址,在传输时MSB放在流的开始;
LSB存储时放在高地址,在传输时放在流的末尾。

Little-Endian

Little-Endian其实就是规定MSB在存储时放在高地址,在传输时MSB放在流的末尾;
LSB存储时放在低地址,在传输时放在流的开始。

举个栗子

0x12345678
Big-Endian
地址0:0x12;地址1:0x34;地址2:0x56;地址3:0x78
Little-Endian
地址0:0x78;地址1:0x56;地址2:0x34;地址3:0x12

总结

其实大小端很简单只需了解几点:

  1. 大小端是由硬件决定的,小端主要是x86处理器,大端主要是PowerPC;
  2. 大小端是一种字节存储机制;
  3. 大端是最重要的字节存储在低地址;
  4. 小端是最重要的字节存储在高地址。

程序员笔记专题:
http://www.jianshu.com/c/ae2d7c7fc623

    原文作者:无敌大灰狼me
    原文地址: https://www.jianshu.com/p/05aac833eacd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞