嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。也就是说Big-endian模式符合人的习惯,而Little-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
若判断处理器是Big还是Little模式,有两种方法。
1、
int i=1;
char *p=(char *)&i;
if(*p==1)
printf("1");
else
printf("2");
大小端存储问题,如果小端方式(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端
2、
int checkCPU( )
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return(c.b ==1);
}
}
这个解法涉及到Union的内存分配模式。
Union的大小为其内部所有变量的最大值,并且按照类型最大值的整数倍进行内存对齐。
例如:
typedef Union
{
char c[10];
char cc1;
}u11;首先按照char c[10]分配10个字节,然后按照char的1个字节对齐,最终sizeof(u11)=10;
typedef union
{
char c[10];
int i;
}u22;首先按照char c[10]分配10个字节,然后按照int的4个字节对齐,最终sizeof(u22)=12;
typedef union
{
char c[10];
double d;
}u33;首先按照char c[10]分配10个字节,然后按照double的4个自己对齐,最终sizeof=16;
union U1{
5char c;
6int i;
7double d;
8 } ;按照double的8个字节分配,最终为8;
9union U2{
10char c;
13 } ;按照char c的一个字节分配,最终sizeof为1;
14
15union U3{
16char c;
17int i;
18// double d;
19 };按照int的4个字节分配,最终sizeof为4;
因此,举例中union分配的内存按照int分配4个字节,如果是小端模式则存放的方式为
地址A
------------------------------------
|A |A+1 |A+2 |A+3 | int a;
|0x01 |0x00 |0x00 |0x00 |
-------------------------------------
|A |char b;
| |
---------
如果是大端如何存储c.a的呢?
地址A
------------------------------------------
|A |A+1 |A+2 |A+3 |int a;
|0x00 |0x00 |0x00 |0x01 |
------------------------------------------
|A |char b;
| |
---------
因此我们就可以通过查看char b==1?来判断大小端了。
顺便说明一下struct的内存分配方式。
struct的内存大小为每个数据内存的加和,首先按照最大的数据类型进行单个分配,如果前一个数据占用不了所有的内存,而剩下的内存可以放下下一个数据,则第二个数据不另外分配内存,否则重新分配一个最大类型的内存单元。
struct{
char c;
double d;
};16
struct{
char c;
char c1;
double d;
};16
struct{
char c;
double d;
char c2;
};24
分享到:
相关推荐
所谓的小端模式,是指数据的低位保存在内存的低地址中,而数 据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
本文主要描述大端小端的概念,分类和区别,还讲述了他们的由来,以及各自的优缺点,对初识者具有很大的帮助
大端 小端
大端和小端的区别,数据在内存里面存放的方式,源代码讲解,发上来大家一起学习下!
描述大端、小端模式,给出了如何判断CPU是哪种模式的代码!
运行程序,可判识并输出程序所在平台的存储方式,是大端还是小端。
关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。
自己根据spy3中的大端与小端的使用,总结出大小端的理解与区别,及intel与motorola
小端大端透析-附检测代码,帮你理清计算机、单片机的大小端存储,含图片形象解析;附测试代码,方便测试;是计算机专业和电子专业以及广大单片机开发人员必备资料
字节序转换辅助类,short大小端转换,ushort大小端转换,int大小端转换,uint大小...short类型 小端转大端,short类型 大端转小端,int类型 小端转大端,int类型 大端转小端,long类型 小端转大端,long类型 大端转小端
西门子PLC接口,大端和小-Endian的存储格式pdf,西门子PLC接口,大端和小-Endian的存储格式:本文介绍了SINUMERIK:PLC接口,和Little-Endian的Big-Endian的存储格式
iOS 大端格式和小段格式 文档
大端机小端机检查器-用于检查PC是大端机还是小端机
开头讲个有关 大端小端的故事: 端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头...
字节转浮点数.zip ,4字节转浮点数,大端小端转换软件,window版本
提供一个大小端转换的类,可以转换short int float double类型,提供一个大小端转换的类,可以转换short int float double类型,提供一个大小端转换的类,可以转换short int float double类型
其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。
开头讲个有关 大端小端的故事: 端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头...
在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。 先回顾两个关键词,MSB和LSB: MSB:Most Significant Bit ------- 最高有效位 LSB:Least ...
二进制文件大小端转换工具,单独工具;二进制文件大小端转换工具,单独工具;二进制文件大小端转换工具,单独工具