`
kongweile
  • 浏览: 517441 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

大端小端区别、Union和Struct的内存分配

 
阅读更多

嵌入式系统开发者应该对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  {
 char  c;
 int  i;
 double  d;
    } ;按照double的8个字节分配,最终为8;
 union U2  {
10  char  c;
13      } ;按照char c的一个字节分配,最终sizeof为1;
14 
15  union U3  {
16  char  c;
17  int  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

分享到:
评论

相关推荐

    STM8S单片机中union联合体的应用

    3. **字节序问题**:不同的处理器可能有不同的字节顺序(大端序或小端序),在跨平台编程时需注意。 4. **数据覆盖**:由于union的所有成员共享同一内存空间,修改一个成员会影响到其他成员的值。 通过熟练掌握...

    嵌入式Linux面试必备

    - **大小端问题**:通过联合体可以判断系统是大端还是小端,例如一个包含int和char的union,如果char在前,那么读取union的值就可以知道字节顺序。 - **大小端转换**:在不同的字节序系统之间传递数据时,需要进行...

    华为面试题

    根据给定的文件信息,我们可以深入探讨几个关键的IT知识点:位结构的使用与理解、内存分配机制以及字节序的识别。 ### 位结构详解 位结构是C语言中的一种特殊结构,允许开发者直接对数据的二进制位进行操作,这在...

    关于嵌入式开发的八股文资源

    这在处理内存有限的嵌入式系统时特别有用,例如判断系统是大端还是小端,或者进行内存效率高的数据转换。 大小端问题是指处理器如何在内存中存储多字节数据。大端系统将最高有效字节存储在最低地址,反之则为小端...

    上海 华为面试 题

    了解大端和小端模式对于理解数据在内存中的表示以及跨平台编程至关重要。 6. **strlen()函数**: strlen()是C语言中的一个库函数,用于计算字符串的长度,即直到遇到第一个'\0'字符前的所有字符数量。它的返回类型...

    c语言设计入门心得

    联合与大端模式(Big_endian)和小端模式(Little_endian)的概念紧密相关。这两种模式涉及处理器如何存储多字节数字的字节顺序。在大端模式中,高字节存储在较低的地址,而在小端模式中,低字节存储在较低的地址。...

    C语言字节序比特序

    在C语言中,字节序与比特序是基础概念,它们描述了计算机内存中数据的存储方式和位的排列顺序。理解这些概念对于处理二进制数据、进行底层编程或开发跨平台应用至关重要。 1. 大小端的概念 大小端模式(Endianness...

    结构体通信

    通常,可以使用固定长度的字段,避免对齐问题,并在必要时进行字节序转换(例如,从大端字节序转为小端字节序,反之亦然)。 此外,对于更复杂的系统,可能还需要考虑错误处理和数据校验机制,例如添加校验和或使用...

    华为研祥迈瑞北电群硕腾讯等公司笔试题目汇总

    11. **ARM的字节存储格式**:分为大端和小端模式,影响数据在内存中的存储顺序。 12. **ARM处理器的操作模式**:包括用户模式、FIQ、IRQ、管理模式、数据访问中止模式、未定义指令中止模式和系统模式,其中除用户...

    你必须知道的495个C语言问题

    此外,如果需要在不同的平台之间进行数据交换,结构体的对齐和字节序(大端或小端)也会成为必须考虑的因素。 ### 总结 通过上述内容,我们可以看到,C语言提供了一系列强大的工具和特性,允许程序员以极高的自由度...

    C++ 旅程

    计算机系统存储多字节数据时,根据字节顺序的不同分为两种模式:大端模式(Big-Endian)和小端模式(Little-Endian)。 - **大端模式:**高位字节存储在较低的地址空间。 - **小端模式:**低位字节存储在较低的地址...

    Cpp面经200问.pdf

    通过检查特定内存地址的内容(如使用union联合体、指针类型转换等)来判断系统是大端存储还是小端存储。 #### 44. volatile、mutable和explicit关键字 volatile指示编译器不要优化该变量,因为它可能在程序控制之外...

    嵌入式软件工程师笔试题.pdf

    - 大端(Big endian)和小端(Little endian):计算机中不同架构处理多字节数据的顺序不同,大端先存储最高有效字节,小端则相反。 3. C语言结构体和联合体: - 结构体(struct):用户自定义的数据类型,可以...

    c语言进阶学习,复习资料

    - 小端模式则相反,低位在低地址,高位在高地址。 - 大小端模式由处理器决定,影响多字节数据在内存中的布局。 6. 浮点型存储: - 根据IEEE 754标准,浮点数分为32位的单精度和64位的双精度。 - 符号位决定正负...

    共用体union的妙用

    1. **判断CPU字节序**:由于共用体的成员共享存储空间,可以用来检测系统是大端模式还是小端模式。通过设置一个整数并检查其在内存中的字节布局,可以判断CPU的字节顺序。例如: ```c union TestCPU{ int i; ...

    c语言的课堂笔记和代码

    - 在`大小端问题`部分,通过联合体(Union)展示了如何检查计算机的字节序,即大端对齐还是小端对齐。大端模式中,高字节存储在低地址,反之则为小端模式。这里使用了两个不同的方法来检查,但原理相同,都是通过将...

    一看就懂得c语言ppt

    例如,整型可能是大端或小端存储,浮点型遵循IEEE 754标准。 2. 基本操作:对每个数据类型,C语言提供了一系列操作符,如算术运算符(+、-、*、/、%)、比较运算符(==、!=、<、>、、>=)、逻辑运算符(&&、||、!)...

    linux下tcp简单的socket编程

    字节序是指多字节数在内存中的存储顺序,分为大端字节序(高字节在前,低字节在后)和小端字节序(低字节在前,高字节在后)。在不同的处理器架构上,字节序可能不同。判断方法通常是将整数1写入内存,然后读取并...

    PowerPC 64bits ELF ABI version 1.9

    - 规范定义了结构体(struct)和联合体(union)的内存布局,这对于数据结构的对齐和内存使用效率至关重要。 7. **位字段**: - 对于需要紧凑表示的数据,如标志位集合,位字段提供了一种节省空间的方法。 8. **...

Global site tag (gtag.js) - Google Analytics