大端模式和小端模式的区别

大端模式和小端模式的区别

在C语言中除了8位的char型之外,还有16位的short型,32位的long型(要看具体的编译器),对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

大端模式:

字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

小端模式:

与大端存储模式相反,在小端存储模式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。

例如,16位宽的数0x1234在小端模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:


内存地址


0x4000


0x4001


存放内容


0x34


0x12

而在大端模式CPU内存中的存放方式则为:


内存地址


0x4000


0x4001


存放内容


0x12


0x34

32位宽的数0x12345678在小端模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:


内存地址


0x4000


0x4001


0x4002


0x4003


存放内容


0x78


0x56


0x34


0x12

而在大端模式CPU内存中的存放方式则为:


内存地址


0x4000


0x4001


0x4002


0x4003


存放内容


0x12


0x34


0x56


0x78

我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

Note:采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。

(我的理解:小端模式在低字节就放一个低位)

下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:

int main()

{

short int x;

char x0,x1;

x=0x1122;

x0=*((char*)&x); //低地址单元 ,或者((char*)&x)[0];

x1=*((char*)&x + 1); //高地址单元,或者((char*)&x)[1];

printf("x0=%x\nx1=%x\n",x0,x1);

}

若x0=0x11,则是大端; 若x0=0x22,则是小端......

下面很深刻,拜读一下:

大端(Big Endian)与小端(Little Endian)详解

【大端(Big Endian)与小端(Little Endian)简介】

Byte Endian是指字节在内存中的组织,所以也称它为Byte Ordering,或Byte Order。

对于数据中跨越多个字节的对象, 我们必须为它建立这样的约定:

(1) 它的地址是多少?

(2) 它的字节在内存中是如何组织的?

针对第一个问题,有这样的解释:

对于跨越多个字节的对象,一般它所占的字节都是连续的,它的地址等于它所占字节最低地址。(链表可能是个例外, 但链表的地址可看作链表头的地址)。

比如: int x, 它的地址为0×100。 那么它占据了内存中的Ox100, 0×101, 0×102, 0×103这四个字节(32位系统,所以int占用4个字节)。

上面只是内存字节组织的一种情况: 多字节对象在内存中的组织有一般有两种约定。 考虑一个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谁位于内存的最低地址, 即谁代表该对象的地址?

这就引出了大端(Big Endian)与小端(Little Endian)的问题。

如果LSB在MSB前面, 既LSB是低地址, 则该机器是小端; 反之则是大端。

DEC (Digital Equipment Corporation,现在是Compaq公司的一部分)和Intel的机器(X86平台)一般采用小端。

IBM, Motorola(Power PC), Sun的机器一般采用大端。

当然,这不代表所有情况。有的CPU即能工作于小端, 又能工作于大端, 比如ARM, Alpha,摩托罗拉的PowerPC。 具体情形参考处理器手册。

具体这类CPU是大端还是小端,应该和具体设置有关。

(如,Power PC支持little-endian字节序,但在默认配置时是big-endian字节序)

一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是Little Endian的。少部分,如MAC OS ,是Big Endian 的。

所以说,Little Endian还是Big Endian与操作系统和芯片类型都有关系。

Linux系统中,你可以在/usr/include/中(包括子目录)查找字符串BYTE_ORDER(或

_BYTE_ORDER, __BYTE_ORDER),确定其值。BYTE_ORDER中文称为字节序。这个值一般在endian.h或machine/endian.h文件中可以找到,有时在feature.h中,不同的操作系统可能有所不同。

对于一个数0×1122

使用Little Endian方式时,低字节存储0×22,高字节存储0×11

而使用Big Endian方式时, 低字节存储0×11, 高字节存储0×22

经一网友指正,才知道,上面的描述,是不准确的.

想了下,觉得如下描述可能更合适:

使用Little Endian方式存储数据时,数据的LSB相对最没意义的数据位,存放在低地址位置,这里的LSB也就是22了.也即,

低地址存储0×22, 高地址存储0×11

而使用Big Endian方式存储数据时,数据的MSB最有意义的数据位,存放在低地址位置,这里的MSB也就是11了.也即

低地址存储0×11, 高地址存储0×22

助记:

1)所谓MSB (Most Significant Byte),名字很复杂,不知是否有人没搞懂,反正我开始看到这个词时候,就很糊涂,有点不完全理解.其实简单说MSB就是,一个数字中,最重要的那位,

举例来说,12004,中文读作,一万两千零四,那最高位的1,就表示了一万,此处就称作MSB,最有意义的位.

2)一般常见的数据存储,用文字写出来的时候,其内容书写格式,多数是从低地址到高地址.(更符合人类思维的原因)

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

地址0×3000 中存放11

地址0×3001 中存放22

地址0×3002 中存放33

连起来就写成地址0×3000-0×3002中存放了数据0×112233.

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

解释的有点乱,希望有人能看懂.

如果还有哪里有误,还请各位继续指正.谢谢.

【用函数判断系统是Big Endian还是Little Endian】

bool IsBig_Endian()

//如果字节序为big-endian,返回true;

//反之为   little-endian,返回false

{

unsigned short test = 0×1122;

if(*( (unsigned char*) &test ) == 0×11)

return TRUE;

else

return FALSE;

}//IsBig_Endian()

大端模式与小端模式概念及详解  

在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。  

先回顾两个关键词,MSB和LSB:  

MSB:Most Significant Bit ——- 最高有效位

LSB:Least Significant Bit ——- 最低有效位  

大端模式(big-edian)  big-endian:MSB存放在最低端的地址上。  

举例,双字节数0×1234以big-endian的方式存在起始地址0×00002000中:

| data |<– address

| 0×12 |<– 0×00002000

| 0×34 |<– 0×00002001   

在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0×8B8A为例):

bit | 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15

——MSB———————————-LSB

val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |

+——————————————–+

= 0×8 B 8 A   

小端模式(little-endian)   little-endian:LSB存放在最低端的地址上。  

举例,双字节数0×1234以little-endian的方式存在起始地址0×00002000中:

| data |<– address

| 0×34 |<– 0×00002000

| 0×12 |<– 0×00002001   

在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(以双字节数0×8B8A为例):

bit | 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0

——MSB———————————–LSB

val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |

+———————————————+

= 0×8 B 8 A

二、数组在大端小端情况下的存储:  

以unsigned int value = 0×12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:  Big-Endian: 低地址存放高位,如下:

高地址

—————

buf[3] (0×78) — 低位

buf[2] (0×56)

buf[1] (0×34)

buf[0] (0×12) — 高位

—————

低地址

Little-Endian: 低地址存放低位,如下:

高地址

—————

buf[3] (0×12) — 高位

buf[2] (0×34)

buf[1] (0×56)

buf[0] (0×78) — 低位

————–

低地址  

时间: 2024-11-03 22:01:54

大端模式和小端模式的区别的相关文章

详解大端模式和小端模式

详解大端模式和小端模式 原文地址:http://blog.csdn.net/ce123_zhouwei/article/details/6971544 一.大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战.战争的原因:大家都知道,吃鸡蛋的时候,原始 的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,

详解大端模式和小端模式(转载)

详解大端模式和小端模式 转载自:http://blog.csdn.net/ce123_zhouwei/article/details/6971544 一.大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战.战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下

详解大端模式和小端模式(转)

一.大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战.战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚.然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了

大端模式与小端模式

对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在存储器中如何安排这些字节.在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节的最小地址.例如,假设一个型为int变量x的地址为0x100,也就是说,地址表达式&x的值为0x100.那么,x的4个字节被存储在存储器的0x100,0x101,0x102和0x103位置. 排列表示一个对象的字节有两个通用的规则.考虑一个w位的整数,位表示为[Xw-1,xw-2,...,x1,x0],其中xw-1是最

计算机的大端模式和小端模式

大端模式和小端模式指的是我们计算机的存储数据的方通常又称为大尾和小尾. 大端:数据的高字节保存在内存的高地址 小端:数据的低字节保存在内存的低地址 下面是两种方式的示意图 堆栈指针寄存器SP的走向从SP到SP+3(SP始终指向栈顶) 知识链接: 断点和现场保护:这是堆栈的主要功能 保护断点指主程序调用子程序或执行中断服务程序的时候,为了能在子程序或者中断服务程序执行完之后顺利的返回主程序,必须将断点处的有关信息压入堆栈,执行完子程序后再按照先进先出的原则将其pop出来回复有关寄存器的内容,使得主

大端模式与小端模式、网络字节顺序与主机字节顺序

大端模式与小端模式 一.概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式. 先回顾两个关键词,MSB和LSB: MSB:Most Significant Bit  ------- 最高有效位     LSB:Least Significant Bit ------- 最低有效位 大端模式(big-edian) big-endian:MSB存放在最低端的地址上. 举例,双字节数0x1234以big-endia

数据在内存中存储的方式:大端模式与小端模式

什么是大端模式,什么是小端模式? 所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放: 所谓小端模式(Little-endian), 是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内在的低地址中,这种存储模式将地址的高低和数据位 权有效结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致; 为什么有大小端之分: 因

操作系统大端模式和小端模式

在C语言中除了8位的char型之外,还有16位的short型,32位的long型(要看具体的编译器),对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着如何将多个字节安排的问题.因此就导致了大端存储模式和小端存储模式. 大端模式: 字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中. 小端模式: 与大端存储模式相反,在小端存储模式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节. 例如,16位宽的数0x1234在小端模式

大端模式和小端模式

详细大家都听说过大端模式和小端模式,但是究竟何为大端何为小端还是不容易记清楚,当然大端小端起源于一个典故(国外的) 这里我就不说了,感兴趣自己百度吧!回到我们的主题来,是这么回事,其实对于大端小端是翻译过来的,也翻译的不是很好如果我们把大端叫做大尾端小端叫小尾端. 那么这个尾巴又是什么那?尾巴指的是数据的末尾 比如1234 那么4就是 末尾.大尾端就是末尾是大的地址.反正亦然!