大端存储与小端存储的区别
- 格式:doc
- 大小:26.50 KB
- 文档页数:4
plc中word最大值
一、大端与小端之分
在PLC系统中,数据存储在以字节为单元的可寻址存储器中。
这些数据一般包括如:BYTE、WORD、DWORD、REAL、STRING等。
WORD 由两个字节组成,DWORD由4个字节组成,STRING如S7-200 SMART PLC中最多由255个字节组成。
对于这些多字节数据类型,都被存储为连续的字节序列。
那么必然存在着一个如果将多个字节安排的问题。
因此就导致了大端存储模式和小端存储模式。
例如一个值为0x7788的16bit的WORD型变量x,存放在0x0010开始存储器地址中。
对于大端模式,就是将0x77放在低地址中,即0x0010中,0x88放在高地址中,即0x0011中。
小端模式,刚好相反。
大端模式:是指对于多字节数据的MSB(最高有效字节)保存在内存的低地址中,而数据的LSB(最低有效字节)保存在内存的高地址中。
小端模式:是指对于多字节数据的MSB(最高有效字节)保存在内存的高地址中,而数据的LSB(最低有效字节)保存在内存的低地址中。
比如以四字节DWORD数值0x0A0B0C0D的存放方式为例:大端模式:最高位字节是0x0A,存储在最低的内存地址a处,下一个字节0x0B 存在后面的地址a+1,以此类推。
小端模式:最高位字节是0x0A,存储
在最高的内存地址a+3处,下一个字节0x0B存在后面的地址a+2,以此类推。
大小头表示方法大小头表示方法大小头是指计算机中常用的两种字节序,分别为大端字节序和小端字节序。
在不同的计算机体系结构中,采用的字节序可能不同,因此在进行数据传输或处理时需要进行大小头转换。
1. 大端字节序大端字节序也称为网络字节序,是指将高位字节存储在内存低地址处,低位字节存储在内存高地址处。
例如十六进制数0x12345678,在大端字节序下存储为:地址: 0x1000 0x1001 0x1002 0x1003内容: 12 34 56 78其中,地址递增方向为从左到右。
2. 小端字节序小端字节序也称为本地字节序,是指将低位字节存储在内存低地址处,高位字节存储在内存高地址处。
例如十六进制数0x12345678,在小端字节序下存储为:地址: 0x1000 0x1001 0x1002 0x1003内容: 78 56 34 12其中,地址递增方向为从左到右。
3. 大小头转换方法大小头转换方法可以使用位运算符和指针操作完成。
以下是一个示例代码:void swap(char* a, char* b) {char tmp = *a;*a = *b;*b = tmp;}void big2little(char* p, int len) {for (int i = 0; i < len / 2; ++i) {swap(p + i, p + len - i - 1);}}void little2big(char* p, int len) {for (int i = 0; i < len / 2; ++i) {swap(p + i, p + len - i - 1);}}其中,big2little函数用于将大端字节序转换为小端字节序,little2big 函数用于将小端字节序转换为大端字节序。
这两个函数都需要传入一个指向数据的指针和数据长度。
4. 注意事项在进行大小头转换时,需要注意以下几点:- 转换前后数据长度不变;- 转换过程中不要改变数据本身;- 转换时需要考虑数据类型和字节对齐方式。
在C语言中,结构体(struct)是一种自定义的数据类型,可以包含多个不同类型的数据成员。
位域(bit-field)是结构体中的一个特殊成员,用于存储固定位数的数据。
位域通常用于紧凑的数据存储,例如在嵌入式系统或低级编程中。
大小端(Endian)是指数据在内存中的存储顺序,分为大端(Big Endian)和小端(Little Endian)两种。
大端模式是指高位字节存储在内存的低地址处,而小端模式是指低位字节存储在内存的低地址处。
在结构体中定义位域时,需要指定每个位域的宽度和顺序,以便确定它们在内存中的布局。
同时,结构体的整体大小也会受到位域的影响。
由于位域是按照字节对齐的,因此如果位域的总宽度不是8的倍数,则会浪费一些空间。
关于大小端问题,对于结构体中的位域,其存储顺序与整型数据相同,即采用系统默认的大小端顺序。
因此,如果需要在不同大小端系统之间移植程序,需要注意位域的存储顺序是否一致。
如果需要确保位域的存储顺序一致,可以使用C标准库中的`#pragma pack`指令来指定结构体的对齐方式。
下面是一个简单的示例代码,演示了如何在C语言中使用结构体和位域:```c#include <stdio.h>struct MyStruct {char a; // 占用1个字节int b : 10; // 占用10个比特(1个字节)int c : 12; // 占用12个比特(1个字节)char d; // 占用1个字节};int main() {struct MyStruct s = {0x0A, 0x3F, 0x4B};printf("a: %x, b: %x, c: %x, d: %x\n", s.a, s.b, s.c, s.d);return 0;}```输出结果将显示`a`, `b`, `c`, `d`的值。
注意,由于系统默认采用大端模式,因此`b`和`c`的值将按照高位字节在前的方式存储和显示。
【大端(Big Endian)与小端(Little Endian)简介】Byte Endian是指字节在内存中的组织,所以也称它为Byte Ordering,或Byte Order。
对于数据中跨越多个字节的对象,我们必须为它建立这样的约定:(1) 它的地址是多少?(2) 它的字节在内存中是如何组织的?针对第一个问题,有这样的解释:对于跨越多个字节的对象,一般它所占的字节都是连续的,它的地址等于它所占字节最低地址。
(链表可能是个例外,但链表的地址可看作链表头的地址)。
比如: int x,它的地址为0x100。
那么它占据了内存中的Ox100, 0x101,0x102, 0x103这四个字节(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。
关于大端模式与小端模式的介绍
数据组织是指数据的传送顺序。
目前常见的32为处理器的数据总线粒度为1字节,在传送时,一个32位数据的最高字节可以放在数据总线的最低8位传送,也可以放在数据总线的最高8位传送,因此出现了大端和小端两种数据组织方法。
大端是指一个数据的最高位放在数据总线的最低位传送或者放在地址较小的存储器位置存储;小端是指一个数据的最高位放在数据总线的最高位传送或者放在地址较高的存储器位置存储。
Wishbone同时支持大端和小端两者数据组织方式。
当数据总线的粒度和宽度相同时,大端和小端是一样的。
大端模式
所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
在大端模式下,前32位应该这样读:e6 84 6c 4e (假设int占4个字节)。
结构体大小端定义大小端(Endian)是计算机存储数据的一种方式,它决定了数据在内存中的存储顺序。
在计算机系统中,数据在内存中的存储是以字节为单位的,每个字节有一个唯一的地址。
在存储多字节的数据时,计算机可以选择不同的字节存储顺序,即大小端。
大小端定义了数据的高位字节和低位字节的存储顺序。
在小端存储方式中,数据的低位字节(最小有效位)存储在低地址中,而高位字节(最高有效位)存储在高地址中。
而在大端存储方式中,数据的高位字节存储在低地址中,低位字节存储在高地址中。
为了更好地理解大小端的概念,我们可以以一个结构体的存储为例。
假设我们有一个结构体定义如下:```cstruct example {int a;char b;short c;};```在内存中,这个结构体的存储空间是连续的。
根据大小端的不同,这个结构体的存储方式也会有所区别。
在小端存储方式中,结构体的存储顺序如下:```地址内容0x1000 a的低字节0x1001 a的高字节0x1002 b0x1003 c的低字节0x1004 c的高字节```可以看到,结构体的成员变量按照从低地址到高地址的顺序依次存储。
这是因为小端存储方式将数据的低位字节存储在低地址中,高位字节存储在高地址中。
相反,在大端存储方式中,结构体的存储顺序如下:```地址内容0x1000 a的高字节0x1001 a的低字节0x1002 b0x1003 c的高字节0x1004 c的低字节```可以看到,结构体的成员变量按照从高地址到低地址的顺序依次存储。
这是因为大端存储方式将数据的高位字节存储在低地址中,低位字节存储在高地址中。
在实际应用中,大小端的选择对于数据的传输和解析非常重要。
在网络通信中,不同的计算机可能使用不同的大小端存储方式。
因此,在进行网络数据传输时,需要对数据进行大小端的转换,以保证数据的正确解析。
在编程语言中,通常提供了一些函数或宏来进行大小端的转换。
例如,在C语言中,可以使用`htonl`和`ntohl`函数来进行32位整型数据的大小端转换。
大小端存储模式解析算法
大小端存储模式是指在计算机系统中用来存储多字节数据的方式。
在小端存储模式下,数据的低字节被存储在内存的低地址处,而数据的高字节被存储在内存的高地址处。
相反,在大端存储模式下,数据的高字节被存储在内存的低地址处,而数据的低字节被存储在内存的高地址处。
让我们来分析一下大小端存储模式的解析算法。
假设我们有一个4字节的整数数据0x12345678,我们想要将其存尐到内存中。
在小端存储模式下,它会被存储为0x78 0x56 0x34 0x12,而在大端存储模式下,它会被存储为0x12 0x34 0x56 0x78。
从软件开发的角度来看,理解存储模式对于处理网络数据包、文件格式解析以及跨平台开发至关重要。
在处理这些情况时,我们需要考虑数据在不同存储模式下的解析方式,以确保数据的正确解释和处理。
此外,对于嵌入式系统的开发者来说,了解存储模式也是至关重要的。
因为某些处理器可能采用不同的存储模式,开发者需要确保他们的代码在不同的系统上都能正确地解析数据。
总的来说,大小端存储模式的解析算法涉及到理解数据在内存
中的存储方式,以及在不同系统和平台下如何正确地解释和处理这
些数据。
这对于软件开发者和系统工程师来说都是一个重要的概念,需要在实际的开发和系统设计中加以考虑和应用。
多字节大小端转换方法-回复主题:多字节大小端转换方法字节顺序指的是数据在内存中存储的方式,即多字节数据是按照从左到右还是从右到左的顺序存储的。
在计算机系统中,常见的字节顺序有大端和小端两种。
大端字节顺序指的是将多字节数据的高位字节放在内存的低地址,低位字节放在高地址;而小端字节顺序则是将多字节数据的低位字节放在内存的低地址,高位字节放在高地址。
在网络通信和文件存储等场景中,不同设备之间可能采用不同的字节顺序。
因此,在进行数据传输和处理时,需要进行字节顺序的转换。
本文将介绍多字节大小端转换的方法,帮助读者理解并实现正确的字节顺序转换。
1. 了解大端和小端字节顺序的概念首先,我们需要了解大端和小端字节顺序的定义和区别。
在大端字节顺序中,多字节数据的高位字节存储在低地址,低位字节存储在高地址;而在小端字节顺序中,多字节数据的低位字节存储在低地址,高位字节存储在高地址。
2. 理解多字节数据的存储方式在计算机内存中,多字节数据(如整型、浮点型等)是连续存储的。
例如,一个4字节的整数在内存中可能按照以下方式存储:- 大端字节顺序:0x12 0x34 0x56 0x78(高地址)→0x12(低地址)- 小端字节顺序:0x12 0x34 0x56 0x78(高地址)→0x78(低地址)3. 实现大端到小端的转换在进行大端到小端的转换时,我们需要将多字节数据的字节顺序进行颠倒。
以下是一个转换的示例代码(以C语言为例):cvoid swapEndian(void* data, size_t size) {char* bytes = (char*)data;for (size_t i = 0; i < size/2; i++) {char temp = bytes[i];bytes[i] = bytes[size-i-1];bytes[size-i-1] = temp;}}4. 实现小端到大端的转换类似地,如果需要将小端字节顺序转换为大端字节顺序,我们也可以使用类似的方法进行转换。
解析大端模式和小端模式一、概念及详解在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。
先回顾两个关键词,MSB和LSB:MSB:Most Significant Bit ------- 最高有效位LSB:Least Significant Bit ------- 最低有效位大端模式(big-endian)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的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CP U对内存采用Little-endian还是Big-endian模式读写。
大端和小端有什么区别
大端和小端的区别
一、大小端出现原因
计算机系统是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。
但对于位数大于8位的处理器,如16位或32位
/64位的处理器,由于寄存器宽度大于一个字节,那么必然存在一个如何将多个字节安排的问题。
因此就导致了大端存储模式和小端存储模式的出现。
二、为什么会有小端字节序?
答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。
所以,计算机的内部处理都是小端字节序。
但是,人类还是习惯读写大端字节序。
所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。
三、
计算机硬件有两种储存数据的方式:大端字节序(bigendian)
和小端字节序(littleendian)。
举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11.
大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
小端字节序:低位字节在前,高位字节在后,即以0x1122形式
储存。
32位整数的求值公式也是一样的。
大端格式:
在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中,如图2.1所示:
小端格式:
与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。
如图2.2所示:
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
解答:
int checkCPU( )
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return(c.b ==1);
}
}
剖析:
嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。
例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址
0x4000
0x4001
存放内容
0x34
0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址
0x4000
0x4001
存放内容
0x12
0x34
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x78
0x56
0x34
0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x12
0x34
0x56
0x78
联合体union的存放顺序是所有成员都从低地址开始存放。
===============附上另一段代码吧,摘自一个开源项目 ====
int big_endian (void)
{
union{
long l;
char c[sizeof(long)];
}u;
u.l = 1;
return (u.c[sizeof(long) - 1] == 1);
}
有时候,用C语言写程序时需要知道是大端模式还是小端模式。
所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为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处理器还可以由硬件来选择是大端模式还是小端模式。
下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元
若x0=0x11,则是大端; 若x0=0x22,则是小端。