little-endian与big-endian

来源:互联网 发布:ocr身份证识别软件 编辑:程序博客网 时间:2024/05/17 02:35

在mdadm源码中,会发现有很多的__cpu_to_le16,le16_to_cpu等很多类似的函数,而在看1.0版本的superblock结构中,他一开始的注释就写了

/*

 * The version-1 superblock :

 * All numeric fields are little-endian.*/

因为到时候会涉及一些超级块位的操作,所以还是很有必要了解下little-endian与big-endian的。


Byte Endian是指字节在内存中的组织,所以也称为Byte Order。 
 对于数据中跨越多个字节的对象, 就有这样的问题,他的地址是多少?他的字节在内存中如何组织?

而一般对于跨越多个字节的对象,他所占的字节是连续的,他的地址等于他所占有字节的最低地址。
比如: int x(假定int为4个字节), 它的地址为0x110。 那么它占据了内存中的Ox110, 0x111, 0x112, 0x113。这只是内存字节组织的一种情况。

多字节对象在内存中的组织有一般有两种约定。 考虑一个W位的整数。

    它的各位表达如下:[Xw-1, Xw-2, ... , X1, X0],它的
    MSB (Most Significant Byte, 最高有效字节)为 [Xw-1, Xw-2, ... Xw-8];
    LSB (Least Significant Byte, 最低有效字节)为 [X7,X6,..., X0]。 
    其余的字节位于MSB, LSB之间。

LSB和MSB谁位于内存的最低地址, 即谁代表该对象的地址? 
这就引出了little-endian与big-endian,也就是小端及大端表示。
如果LSB在MSB前面, 既LSB是低地址, 则该机器是小端; 反之则是大端。不同公司一般偏好不同,例如DEC及Intel机器一般采用小端,而IBM,SUN机器一般采用大端。但也有的CPU能够工作于大端也能工作于小端、


Linux系统中,可以在/usr/include/中(包括子目录)查找字符串BYTE_ORDER(或
_BYTE_ORDER, __BYTE_ORDER),确定其值。BYTE_ORDER中文称为字节序。这个值一般在endian.h或machine/endian.h文件中可以找到,有时在feature.h中,不同的操作系统可能有所不同。

对于一个数0x1122
使用Little Endian方式时,低地址存储0x22, 高地址存储0x11
而使用Big Endian方式时,低地址存储0x11, 高地址存储0x22

对于MSB, LSB的理解,当年有个老师是这么说的,就像钱,19999元,当然是最高位的1是最重要的,最多啊,Most Significant Byte,而低位的数字当然是Least Significant Byte。权当作为对MSB,LSB的助记符吧- -

 一般常见的数据存储,用文字写出来的时候,其内容书写格式,多数是从低地址到高地址.

举例,一个16进制数是 0x11 22 33, 而存放的位置是

地址0x3000 中存放11

地址0x3001 中存放22

地址0x3002 中存放33

连起来就写成地址0x3000-0x3002中存放了数据0x112233.

而这种存放和表示方式,正好符合大端.



                                             
0 0
原创粉丝点击