什么是CPU的大端小端

合集下载

字节序,大端,小端的概念

字节序,大端,小端的概念

字节序,大端,小端的概念大端、小端:大小端是指CPU存储数据的方式,比如一个0x01020304这个整数,在WIN、Linux下在内存中的布局如下[01][02][03][04] 注意左边是高地址,而右边是低地址在UNIX下则是[04][03][02][01] 注意左边是高地址,而右边是低地址通俗的说,和WIN下的内存布局一致的就是小端,和UNIX下一致的就是大端。

其实在以前还出现过中端的的机型,不过这些机型也太“孤僻”了,已经落伍没人生产没人用了。

网络字节序:其实是指网络传输的字节序,这个字节序可能是大端序或者小端序,这取决于软件开始时通讯双方的协议规定。

平时,如果有人说的网络字节序,那么大家就认为是大端序。

主机字节序:是指主机处理数据时采用的字节序,虽然主机字节序和网络字节序是相对的概念,但是我们说主机字节序的时候,并不默认是之大端或者小端,而是结合机型来确定大小端的。

位序:我们通常所说的字节序是指字节之间的关系,但是即使是一个字节中的某一位(bit)也是有排序的问题的。

位序也有大端序,小端序,中端序,也还有其他的乱七八糟的位序的,但是都不常见。

开发的时候,我们是不用关心位序,编译器和CPU会自己处理这些事情。

算术运算与内存操作运算:算术运算是不改变被运算数据的字节序的,此时我们不用关心所操作的数据到底是什么字节序的。

但是内存操作运算就要注意了,比若我们将一个整数指针强制转换为一个字符指针类型,然后对字符指针类型的四个字节进行算数运算,此时我们必须知道是什么字节序。

不然写出的代码要么是错误的,要么移植到其他机器的时候就不能正常运行。

常见的算术有+ - * / % & | ~ << >> = 等,请注意& | ~ << >> 这几个是算术运算而不是内存操作运算,所以他们进行混合运算的时候不用关心字节序或者位序问题。

赋值运算符仅在数据类型兼容的时候才不涉及字节序问题,才能算作算术运算。

大端小端和网络字节序说明

大端小端和网络字节序说明

⼤端⼩端和⽹络字节序说明⼤端(Big-Endian)和⼩端(little-Endian)的起源关于⼤端⼩端名词的由来,有⼀个有趣的故事,来⾃于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个⽉中⼀直在苦战。

战争的原因:⼤家都知道,吃鸡蛋的时候,原始的⽅法是打破鸡蛋较⼤的⼀端,可以那时的皇帝的祖⽗由于⼩时侯吃鸡蛋,按这种⽅法把⼿指弄破了,因此他的⽗亲,就下令,命令所有的⼦民吃鸡蛋的时候,必须先打破鸡蛋较⼩的⼀端,违令者重罚。

然后⽼百姓对此法令极为反感,期间发⽣了多次叛乱,其中⼀个皇帝因此送命,另⼀个丢了王位,产⽣叛乱的原因就是另⼀个国家Blefuscu的国王⼤⾂煽动起来的,叛乱平息后,就逃到这个帝国避难。

据估计,先后⼏次有11000余⼈情愿死也不肯去打破鸡蛋较⼩的端吃鸡蛋。

这个其实讽刺当时英国和法国之间持续的冲突。

Danny Cohen⼀位⽹络协议的开创者,第⼀次使⽤这两个术语指代字节顺序,后来就被⼤家⼴泛接受。

⼤端⼩端之分⼩端字节序和⼤端字节序表⽰存储的字节顺序有区别⼩端字节序:低字节存于内存低地址;⾼字节存于内存⾼地址;long型数据0x12345678在⼩端系统中,内存的地址是由低到⾼的顺序;⽽数据的字节也是由低到⾼的⼤端字节序:⾼字节存于内存低地址;低字节存于内存⾼地址;long型数据0x12345678在⼤端系统中,内存的地址是由低到⾼的顺序;⽽数据的字节却是由⾼到低的⽹络字节序⽹络上传输的数据都是字节流,对于⼀个多字节数值,在进⾏⽹络传输的时候,先传递哪个字节?也就是说,当接收端收到第⼀个字节的时候,它将这个字节作为⾼位字节还是低位字节处理,是⼀个⽐较有意义的问题;UDP/TCP/IP协议规定:把接收到的第⼀个字节当作⾼位字节看待,这就要求发送端发送的第⼀个字节是⾼位字节;⽽在发送端发送数据时,发送的第⼀个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第⼀个⾼位字节(即:⾼位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以⼤端法存放的;所以说,⽹络字节序是⼤端字节序;⽐如,我们经过⽹络发送整型数值0x12345678时,在80X86平台中,它是以⼩端发存放的,在发送之前需要使⽤系统提供的字节序转换函数htonl()将其转换成⼤端法存放的数值;常见CPU的字节序Big Endian : PowerPC、IBM、SunLittle Endian : x86、DECARM既可以⼯作在⼤端模式,也可以⼯作在⼩端模式。

大端模式和小端模式

大端模式和小端模式

⼤端模式和⼩端模式⼤端:低地址存⾼位(⾼地址存低位)⼩端:低地址存低位(⾼地址存⾼位)1.故事的起源“endian”这个词出⾃《格列佛游记》。

⼩⼈国的内战就源于吃鸡蛋时是究竟从⼤头(Big-Endian)敲开还是从⼩头(Little-Endian)敲开,由此曾发⽣过六次叛乱,其中⼀个皇帝送了命,另⼀个丢了王位。

我们⼀般将endian翻译成“字节序”,将big endian和little endian称作“⼤尾”和“⼩尾”。

2.什么是Big Endian和Little Endian?在设计计算机系统的时候,有两种处理内存中数据的⽅法。

⼀种叫为little-endian,存放在内存中最低位的数值是来⾃数据的最右边部分(也就是数据的最低位部分)。

⽐如某些⽂件需要在不同平台处理,或者通过Socket通信。

这⽅⾯我们可以借助ntohl(), ntohs(), htonl(), and htons()函数进⾏格式转换,个⼈补充:⼀个操作数作htonl或ntohl结果不⼀定相同,当机器字节序跟⽹络字节序刚好是仅仅big endian和little endian的区别时是相同的。

3. 如何理解Big Endian和Little Endian举个例⼦:int a = 1;a这个数本⾝的16进制表⽰是0x00 00 00 01在内存中怎么存储呢?如果你的CPU是intel x86架构的(基本上就是通常我们说的奔腾cpu),那么就是0x01 0x00 0x00 0x00 , 这也就是所谓的little-endian, 低字节存放在内存的低位.如果你的CPU是⽼式AMD系列的(很⽼很⽼的那种,因为最新的AMD系列已经是x86架构了), 它的字节序就是big-endian, 其内存存储就是0x00 0x00 0x00 0x01在内存中从⾼字节开始存放。

现在世界上绝⼤多数的CPU都是little-endian。

4. 了解big-endian和little-endian有什么作⽤?⼀个重要的作⽤就是了解在⽹络上不同的机器间的数据如何传输。

大端小端(Big-Endian和Little-Endian)

大端小端(Big-Endian和Little-Endian)

大端小端(Big-Endian和Little-Endian)字节序(Endian),大端(Big-Endian),小端(Little-Endian)图文并茂在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。

如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。

目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian,下面先从字节序说起。

一、什么是字节序字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。

其实大部分人在实际的开发中都很少会直接和字节序打交道。

唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。

在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian,引用标准的Big-Endian和Little-Endian的定义如下:a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。

1.1 什么是高/低地址端首先我们要知道我们C程序映像中内存的空间布局情况:在《C专家编程》中或者《Unix环境高级编程》中有关于内存空间布局情况的说明,大致如下图:----------------------- 最高内存地址 0x ffffffff栈底栈栈顶-----------------------NULL (空洞)-----------------------堆-----------------------未初始化的数据----------------------- 统称数据段初始化的数据-----------------------正文段(代码段)----------------------- 最低内存地址 0x00000000以上图为例如果我们在栈上分配一个unsigned char buf[4],那么这个数组变量在栈上是如何布局的呢?看下图:栈底(高地址)----------buf[3]buf[2]buf[1]buf[0]----------栈顶(低地址)1.2 什么是高/低字节现在我们弄清了高/低地址,接着考虑高/低字节。

大端(BigEndian)与小端(LittleEndian)详解

大端(BigEndian)与小端(LittleEndian)详解

大端(BigEndian)与小端(LittleEndian)详解大端(Big Endian)与小端(Little Endian)简介///////////////////////////////////////////////////////1. 你从哪里来?端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。

这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。

小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。

在计算机业Big Endian和Little Endian也几乎引起一场战争。

在计算机业界,Endian表示数据在存储器中的存放顺序。

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

下文举例说明在计算机中大小端模式的区别。

//////////////////////////////////////////////////////2. 读书百遍其义自见小端口诀: 高高低低 -> 高字节在高地址, 低字节在低地址大端口诀: 高低低高 -> 高字节在低地址, 低字节在高地址long test = 0x313233334;小端机器:低地址 --> 高地址00000010: 34 33 32 31 -> 4321大端机器:低地址 --> 高地址00000010: 31 32 33 34 -> 4321test变量存储的是的0x10这个地址,那编译器怎么知道是读四个字节呢? -> 根据变量test的类型long 可知这个变量占据4个字节.那编译器怎么读出这个变量test所代表的值呢? -> 这就根据是little endian还是big endian来读取所以, 小端, 其值为0x31323334; 大端, 其值为0x34333231htonl(test) 的情况: ->其值为: 0x34333231小端机器:00000010: 31 32 33 34 -> 1234大端机器:00000010: 34 33 32 31 -> 4321/////////////////////////////////////////////////////////////////// //////////////////3. 拿来主义Byte Endian是指字节在内存中的组织,所以也称它为Byte Ordering,或Byte Order。

什么是大端模式,和小端模式

什么是大端模式,和小端模式

熟练掌握网络字节序的转换
大端转换
当主机A要把数据发送到主机B时,主机A需要把本机的字节 序转换为网络字节序后才能发送。
小端转换
当主机A收到从主机B发送的数据时,主机A需要把网络字节 序转换为本机的字节序后才能处理。
THANKS
感谢观看
模式。
06
大端模式和小端模式对我们 的启示
深入了解计算机存储机制
大端模式一种数据存储方式,其中高位字节保存在内存的低 地址中,而低位字节保存在内存的高地址中。这种存储方式 在机器字长为16位或32位时比较常见,但现在几乎所有的计 算机都是小端模式。
小端模式一种数据存储方式,其中低位字节保存在内存的低 地址中,而高位字节保存在内存的高地址中。这种存储方式 在机器字长为16位或32位时比较常见,但现在几乎所有的计 算机都是小端模式。
什么是大端模式,和小端模 式
xx年xx月xx日
目 录
• 引言 • 大端模式 • 小端模式 • 大端模式和小端模式的差异 • 大端模式和小端模式的判断方法 • 大端模式和小端模式对我们的启示
01
引言
什么是端模式
• 端模式(Endianness)是指计算机系统在处理字节顺序的方 式,也就是多字节数据在内存中如何排列。
存储顺序
在内存中存储数据时,大端模式将数据的每个字节按照由高到低的顺序存储,以 实现数据的正确表示。
大端模式的应用场景
网络通信
在网络通信中,数据的传输通 常是按照大端模式进行的,因 此需要将数据进行字节序的转 换,以确保接收和发送两端的
数据一致性。
文件存储
在某些文件格式中,如网络协 议中的数据包格式,需要按照 大端模式来读取和解析数据。
小端模式的原理

大端和小端(BigendianandLittleendian)

大端和小端(BigendianandLittleendian)

⼤端和⼩端(BigendianandLittleendian)⼀、⼤端和⼩端的问题对于整型、长整型等数据类型,Big endian 认为第⼀个字节是最⾼位字节(按照从低地址到⾼地址的顺序存放数据的⾼位字节到低位字节);⽽ Little endian 则相反,它认为第⼀个字节是最低位字节(按照从低地址到⾼地址的顺序存放据的低位字节到⾼位字节)。

例如,假设从内存地址 0x0000 开始有以下数据:0x0000 0x0001 0x0002 0x00030x12 0x34 0xab 0xcd如果我们去读取⼀个地址为 0x0000 的四个字节变量,若字节序为big-endian,则读出结果为0x1234abcd;若字节序为little-endian,则读出结果为0xcdab3412。

如果我们将0x1234abcd 写⼊到以 0x0000 开始的内存中,则Little endian 和 Big endian 模式的存放结果如下:地址 0x0000 0x0001 0x0002 0x0003big-endian 0x12 0x34 0xab 0xcdlittle-endian 0xcd 0xab 0x34 0x12⼀般来说,x86 系列 CPU 都是 little-endian 的字节序,PowerPC 通常是 big-endian,⽹络字节顺序也是 big-endian还有的CPU 能通过跳线来设置 CPU ⼯作于 Little endian 还是 Big endian 模式。

对于0x12345678的存储:⼩端模式:(从低字节到⾼字节)地位地址 0x78 0x56 0x34 0x12 ⾼位地址⼤端模式:(从⾼字节到低字节)地位地址 0x12 0x34 0x56 0x78 ⾼位地址⼆、⼤端⼩端转换⽅法htonl() htons() 从主机字节顺序转换成⽹络字节顺序ntohl() ntohs() 从⽹络字节顺序转换为主机字节顺序Big-Endian转换成Little-Endian#define BigtoLittle16(A) ((((uint16)(A) & 0xff00) >> 8) | (((uint16)(A) & 0x00ff) << 8))#define BigtoLittle32(A) ((((uint32)(A) & 0xff000000) >> 24) | (((uint32)(A) & 0x00ff0000) >> 8) | \(((uint32)(A) & 0x0000ff00) << 8) | (((uint32)(A) & 0x000000ff) << 24))三、⼤端⼩端检测⽅法如何检查处理器是big-endian还是little-endian?C程序:int i = 1;char *p = (char *)&i;if(*p == 1)printf("Little Endian");elseprintf("Big Endian");⼤⼩端存储问题,如果⼩端⽅式中(i占⾄少两个字节的长度)则i所分配的内存最⼩地址那个字节中就存着1,其他字节是0.⼤端的话则1在i的最⾼地址字节处存放,char是⼀个字节,所以强制将char型量p指向i则p指向的⼀定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是⼩端。

说明x86、arm、powerpc芯片的大小端

说明x86、arm、powerpc芯片的大小端

说明x86、arm、powerpc芯片的大小端
大小端是指在存储和读取多字节数据时,字节的排列顺序。

具体来说,大小端指示了字节的高位或低位在存储或传输时的排列顺序。

- x86架构中的处理器通常采用小端模式(Little-Endian)。

在小端模式下,多字节数据的低字节存储在低地址处,高字节存储在高地址处。

- ARM架构中的处理器可以支持小端模式和大端模式(Big-Endian)。

大多数ARM处理器采用小端模式,但某些特殊的ARM芯片(如ARM Cortex-A系列)支持切换成大端模式。

- PowerPC架构中的处理器通常采用大端模式。

在大端模式下,多字节数据的高字节存储在低地址处,低字节存储在高地址处。

大小端模式并没有绝对的优劣之分,不同的架构在设计上选择不同的大小端模式主要是出于历史原因和硬件设计上的考虑。

在跨平台开发时,需要注意不同架构的大小端模式可能会导致数据读取和传输的问题。

大端小端

大端小端

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

先回顾两个关键词,MSB和LSB:MSB:MoST Significant Bit ------- 最高有效位LSB:Least Significant Bit ------- 最低有效位大端模式(big-edian)big-endian:MSB存放在最低端的地址上。

举例,双字节数0x1234以big-endian的方式存在起始地址0x00002000中:| data |<-- address| 0x12 |<-- 0x00002000| 0x34 |<-- 0x00002001在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为例):bit | 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15------MSB----------------------------------LSBval | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |+--------------------------------------------+= 0x8 B 8 A小端模式(little-endian)little-endian:LSB存放在最低端的地址上。

举例,双字节数0x1234以little-endian的方式存在起始地址0x00002000中:| data |<-- address| 0x34 |<-- 0x00002000| 0x12 |<-- 0x00002001在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(以双字节数0x8B8A为例):bit | 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0------MSB-----------------------------------LSBval | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |+---------------------------------------------+= 0x8 B 8 A二、数组在大端小端情况下的存储:以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:Big-Endian: 低地址存放高位,如下:高地址---------------buf[3] (0x78) -- 低位buf[2] (0x56)buf[1] (0x34)buf[0] (0x12) -- 高位---------------低地址Little-Endian: 低地址存放低位,如下:高地址---------------buf[3] (0x12) -- 高位buf[2] (0x34)buf[1] (0x56)buf[0] (0x78) -- 低位--------------低地址三、大端小端转换方法:Big-Endian转换成Little-Endian如下:#define BigtoLittle16(A) ((((uint16)(A) & 0xff00) >> 8) | \(((uint16)(A) & 0x00ff) << 8))#define BigtoLittle32(A) ((((uint32)(A) & 0xff000000) >> 24) | \(((uint32)(A) & 0x00ff0000) >> 8) | \(((uint32)(A) & 0x0000ff00) << 8) | \(((uint32)(A) & 0x000000ff) << 24))四、大端小端检测方法:如何检查处理器是big-endian还是little-endian?联合体uniON的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。

详解大端模式和小端模式

详解大端模式和小端模式

一、大端模式和小端模式的起源关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。

战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。

然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另一个国家Blefuscu的国王大臣煽动起来的,叛乱平息后,就逃到这个帝国避难。

据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。

这个其实讽刺当时英国和法国之间持续的冲突。

Danny Cohen一位网络协议的开创者,第一次使用这两个术语指代字节顺序,后来就被大家广泛接受。

二、什么是大端和小端Big-Endian和Little-Endian的定义如下:1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:1)大端模式:低地址-----------------> 高地址0x12 | 0x34 | 0x56 | 0x782)小端模式:低地址------------------> 高地址0x78 | 0x56 | 0x34 | 0x12可见,大端模式和字符串的存储模式类似。

3)下面是两个具体例子:16bit宽的数0x1234在Little-endian模式(以及Big-endian 模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:32bit宽的数0x12345678在Little-endian模式以及Big-endian 模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:4)大端小端没有谁优谁劣,各自优势便是对方劣势:小端模式:强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。

大端存储模式和小端存储模式

大端存储模式和小端存储模式

⼤端存储模式和⼩端存储模式CPU存储数据操作的最⼩单位是⼀个字节。

⼤端存储模式(Big-Endian),⼩端存储模式(Little-Endian)是常见的⼆种字节序。

Little-Endian:低位字节排放在内存的低地址端,⾼位字节排放在内存的⾼地址端。

Big-Endian:⾼位字节排放在内存的低地址端,低位字节排放在内存的⾼地址端。

⽐如0x12345678在内存中的表⽰形式为:采⽤⼤端模式:低地址 --------------------> ⾼地址0x12 | 0x34 | 0x56 | 0x78采⽤⼩端模式:低地址 --------------------> ⾼地址0x78 | 0x56 | 0x34 | 0x12也就是说Big-Endian是指低地址存放最⾼有效字节(MSB),⽽Little-Endian则是低地址存放最低有效字节(LSB)。

⼀般操作系统采⽤的都是⼩端模式,⽽通讯协议采⽤⼤端模式。

1)常见的CPU的字节序Big-Endian : PowerPC,IBM,SunLittle-Endian:x86ARM既可以⼯作在⼤端模式,也可以⼯作在⼩端模式。

2)常见的⽂件的字节序Adobe PS : Big-EndianBMP :Little-EndianGIF : Little-EndianJPEG:Big-Endian此外Java和所有的⽹络通信协议都是使⽤⼤端模式的编码事实上存在字节序,也存在⽐特序。

CPU存储⼀个字节的数据时其字节内的8个⽐特之间的顺序也有Big-Endian和Little-Endian之分。

⽐如字节0xA0的存储格式如下:Big-EndianMSB LSB-------------------------------->1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |Little-EndianLSB MSB-------------------------------->0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |实际上,由于CPU存储数据操作的最⼩单位是⼀个字节,其内部的⽐特序是什么样对我们的程序来说是⼀个⿊盒⼦,也就是说,你给我⼀个指向0xA0这个数的指针,对于Big-Endian⽅式的CPU来说,它是从左往右依次读取这个数的8个⽐特;⽽对于Little-Endian⽅式的CPU来说,则正好相反,是从右往左依次读取这个数的8个⽐特。

cpu的大端模式小端模式优劣对比

cpu的大端模式小端模式优劣对比

cpu的大端模式小端模式优劣对比一、大端模式和小端模式的起源二、什么是大端和小端Big-Endian和Little-Endian的定义如下:1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:2)小端模式:3)下面是两个具体例子: 4)大端小端没有谁优谁劣,各自优势便是对方劣势:三、数组在大端小端情况下的存储:以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:Big-Endian: 低地址存放高位,如下:高地址--------------- buf[3] (0x78) -- 低位buf[2] (0x56) buf[1] (0x34) buf[0] (0x12) -- 高位--------------- 低地址Little-Endian: 低地址存放低位,如下:高地址--------------- buf[3] (0x12) -- 高位buf[2] (0x34) buf[1] (0x56) buf[0] (0x78) -- 低位--------------低地址四、为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。

但是在C语言中除了8bit 的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于五、如何判断机器的字节序可以编写一个小的BOOL IsBigEndian() { int a = 0x1234; char b = *(char *) //通过将int强制类型转换成char单字节,通过判断起始存储位置。

如何判断CPU是大端还是小端模式

如何判断CPU是大端还是小端模式

如何判断CPU是⼤端还是⼩端模式在ARM体系中,每个字单元包含4个字节单元或者两个半字单元。

在字单元中,4个字节哪⼀个是⾼位字节,哪⼀个是低位字节则有两种不同的格式:big-endian和little-endian格式。

在⼩端模式中,低位字节放在低地址,⾼位字节放在⾼地址;在⼤端模式中,低位字节放在⾼地址,⾼位字节放在低地址。

在C语⾔中,不同于结构体,共⽤体(联合体)中的⼏种不同类型的变量存放在同⼀段内存单元中。

利⽤这⼀特点,可以⽤联合体变量判断ARM或x86环境下,存储系统是是⼤端还是⼩端模式。

#include "stdio.h"int main(){union w{int a; //4 byteschar b; //1 byte} c;c.a=1;if (c.b==1)printf("It is Little_endian!\n");elseprintf("It is Big_endian!\n");return 1;}说明:1 在c中,联合体(共⽤体)的数据成员都是从低地址开始存放。

2 若是⼩端模式,由低地址到⾼地址c.a存放为0x01 00 00 00,c.b被赋值为0x01;————————————————————————————地址 0x00000000 0x00000001 0x00000002 0x00000003c.a 01 00 00 00c.b 01 00————————————————————————————3 若是⼤端模式,由低地址到⾼地址c.a存放为0x00 00 00 01,c.b被赋值为0x0;————————————————————————————地址 0x00000000 0x00000001 0x00000002 0x00000003c.a 00 00 00 01c.b 00 00————————————————————————————4 根据c.b的值的情况就可以判断cpu的模式了,现在XP环境下的intel CPU是⼩端模式,不信你可测试下!。

CPU的大小端及如果判断

CPU的大小端及如果判断

CPU的⼤⼩端及如果判断不同体系结构的CPU,数据在内存中存放的排列顺序是不⼀样的。

存储器中对数据的存储是以字节(Byte)为基本单位的,因此,字(Word)和半字(Half-Word)在存储器中就有两种次序,分别称为:⼤端模式(Big Endian)和⼩端模式(Little Endian)。

⼤端存储模式是指字或半字的最⾼字节(Most Significant Bit,MSB)存放在内存的最低位字节地址上,⽽字数据的低字节则存放在⾼地址中。

打个⽐⽅,有⼀个字为0×12345678,这个字由4个字节组成,从⾼位到低位的次序为:0×12,0×34,0×56,0×78。

⼤端模式的次序就像是我们平时书写的次序,先写⼤数,后写⼩数。

另外,⼤端存储次序还⼴泛运⽤在TCP/IP协议上,因此⼜称为⽹络字节次序。

⼩端存储模式是指字或半字的最低位字节(Lowest Significant Bit,LSB)存放在内存的最低位字节地址上,⽽字数据的⾼字节则存放在⾼地址中。

需要注意的⼏点是:(1)数据在寄存器中都是以⼤端模式次序存放的。

(2)对于内存中以⼩端模式存放的数据。

CPU存取数成时,⼩端和⼤端之间的转换是通过硬件实现的,没有数据加载/存储的开销。

⽤⼀个联合体判断⼤⼩端:int CheckEndian(void){union check{int Word;char Half;} Endian;Endian.Word=1;if(1 == Endian.Half)return Little_Endian;elsereturn Big_Endian;}。

大端与小端模式及其举例说明

大端与小端模式及其举例说明

1. 什么是大端,什么是小端:所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

2.为什么会有大小端:为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。

但是在C语言中除了8bit的char之外,还有16bit的short型,32bit 的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。

因此就导致了大端存储模式和小端存储模式。

例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。

对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。

小端模式,刚好相反。

我们常用的X86结构是小端模式,而KEIL C51则为大端模式。

很多的ARM,DSP都为小端模式。

有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

3.大小端在内存中的存放方式举例:例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:而在Big-endian模式CPU内存中的存放方式则为:而在Big-endian模式CPU内存中的存放方式则为:4.如何测试编译器是大端还是小端:下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:#include <stdio.h>int main(){short int x;char x0,x1;x=0x1122;x0=((char *)&x)[0]; //低地址单元x1=((char *)&x)[1]; //高地址单元printf("x0=0x%x,x1=0x%x",x0,x1);//若x0=0x11,则是大端; 若x0=0x22,则是小端......return 0;}以下是我在dev C++里面运行的结果,从结果来看,dev C++用的是小端模式;。

详解大端模式和小端模式

详解大端模式和小端模式

详解大端模式和小端模式/ce123/article/details/6971544 转载一、大端模式和小端模式的起源关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。

战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。

然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另一个国家Blefuscu 的国王大臣煽动起来的,叛乱平息后,就逃到这个帝国避难。

据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。

这个其实讽刺当时英国和法国之间持续的冲突。

Danny Cohen一位网络协议的开创者,第一次使用这两个术语指代字节顺序,后来就被大家广泛接受。

二、什么是大端和小端Big-Endian和Little-Endian的定义如下:1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:1)大端模式:低地址 -----------------> 高地址0x12 | 0x34 | 0x56 | 0x782)小端模式:低地址 ------------------> 高地址0x78 | 0x56 | 0x34 | 0x12可见,大端模式和字符串的存储模式类似。

3)下面是两个具体例子:16bit宽的数0x1234在Little-endian模式(以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:32bit宽的数0x12345678在Little-endian模式以及Big-endian 模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:4)大端小端没有谁优谁劣,各自优势便是对方劣势:小端模式:强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。

认识(大端--小端)端模式

认识(大端--小端)端模式

认识(大端--小端)端模式端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。

这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。

小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。

在计算机业Big Endian和Little Endian也几乎引起一场战争。

在计算机业界,Endian表示数据在存储器中的存放顺序。

下文举例说明在计算机中大小端模式的区别。

如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。

为简单起见,这里使用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。

地址偏移大端模式小端模式0x00 12(OP0)78(OP3)0x01 34(OP1)56(OP2)0x02 56(OP2)34(OP1)0x03 78(OP3)12(OP0)如果将一个16位的整数0x1234存放到一个短整型变量(short)中。

这个短整型变量在内存中的存储在大小端模式由下表所示。

地址偏移大端模式小端模式0x00 12(OP0)34(OP1)0x01 34(OP1)12(OP0)由上表所知,采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将低位存放在低地址。

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

到目前为止,采用大端或者小端进行数据存放,其孰优孰劣也没有定论。

有的处理器系统采用了小端方式进行数据存放,如Intel的奔腾。

大小端——精选推荐

大小端——精选推荐

⼤⼩端存储模式:⼩端:较⾼的有效字节存储在较⾼的存储器地址,较低的有效字节存储在较低的存储器地址。

⼤端:较⾼的有效字节存储在较低的存储器地址,较低的有效字节存储在较⾼的存储器地址。

STM32 属于⼩端模式,简单地说:⽐如:temp=0X12345678;假设temp的地址为:0X4000 0000那么,在内存⾥⾯,其存储就变成了:| 地址 | HEX ||0X4000 0000 |78 56 43 12|更为简单⼀点:低地址---------->⾼地址【⼤端模式】:0X12|0X34|0X56|0X78|低地址---------->⾼地址【⼩端模式】:0X78|0X56|0X34|0X12|⼤端与⼩端的优势⼆者⽆所谓优势,⽆所谓劣势,各⾃优势便是对⽅劣势⼤端模式:符号位的判定固定为第⼀个字节,容易判断正负。

⼩端模式:强制转换数据不需要调整字节内容,1、2、4字节的存储⽅式⼀样数组在⼤端⼩端情况下的存储:以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以⽤unsigned char buf[4]来表⽰value:Big-Endian: 低地址存放⾼位,如下:⾼地址---------------buf[3] (0x78) -- 低位buf[2] (0x56)buf[1] (0x34)buf[0] (0x12) -- ⾼位---------------低地址Little-Endian: 低地址存放低位,如下:⾼地址---------------buf[3] (0x12) -- ⾼位buf[2] (0x34)buf[1] (0x56)buf[0] (0x78) -- 低位--------------低地址为何会出现⼤⼩端之分:这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8bit。

但是在C语⾔中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度⼤于⼀个字节,那么必然存在着⼀个如果将多个字节安排的问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

大端小端这个词的来源
《程序设计实践》第9章中提到,“大端”和“小端”可以追溯到1726年的JonathanSwift的《格列佛游记》,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战争。

1981年10月,Danny Cohen的文章《论圣战以及对和平的祈祷》(On holy wars and a plea for peace)将这一对词语引入了计算机界。

这么看来,所谓大端和小端,也就是big-endian和little-endian,其实是从描述鸡蛋的部位而引申到计算机地址的描述,
为什么会有大小端
在计算机系统中,数据的存放是以byte为单位的,每个内存地址存放一个byte的数据。

但是在C语言中除了1byte的char之外,还有int、float、double等数据类型,其占字节数大于1byte,具体大小由编译器和CPU决定。

对于位数大于8bit的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一byte,那么必然存在着一个如何将多个字节安排的问题。

因此就导致了大端存储模式和小端存储模式。

什么是大端小端
小端模式(Litte-Endian):数据中的高位放置在内存的高地址,数据的低位放置在内存的低地址。

大端模式(Big-Endian): 数据中的高位放置在内存的低地址,数据的低位放置在内存的高地址。

上面的表述比较绕,下面通过一个例子来说明大端模式和小端模式,比如内存中需要存放0x11223344这个数据,那么在大端小段下的存放是怎么样的呢,如下表:
如何判别CPU是大端还是小端
通常CPU设计过程中就设定好了大小端的模式,比如PowerPC .IBM为大端模式,X86、TC27x为小端模式,ARM 即可为大端,也可以小端模式那在我们懒得去查手册的时候,我们可以通过简单的代码来确定CPU的工作模式。

通过利用联合体中各成员公用一段内存,data.num =1 是数据的低位,如果 1 被存储在data 的低字节,则data.ch 也为1,则为小端模式,如果 1 被存储在data
的高字节,这个时候data.ch 的值就是0,则为大端模式。

相关文档
最新文档