1。ANSIC中的ANSIC数据类型包括:整数、浮点数、指针和聚合类型(如数组和结构等)unsingned)取值范围:无符号无符号,默认有符号长整数至少和整数一样长,整数至少和短整数一样长在32位环境下,各种数据的长度类型一般如下:2ARMC具体我们使用IAR作为编译器,版本7.2注:在32位ARM中,words为32位,halfwords为16位,wordssection为8位。您可以看到以下有关整数数据类型的信息。使用typedef重新定义下面的数据类型。Long没有用,因为都是32位的。一个int就够了。typedefunsignedcharuint8;//!<无符号8位整型变量typedefsignedcharint8;//!<有符号8位整型变量typedefunsignedshortuint16;//!<无符号16位整型变量typedefunsignedshortint16;//!<有符号16位整型变量typedefunsignedintuint32;//!<无符号32位整数变量typedefsignedintint32;//!<有符号32位整数变量typedeffloatfp32;//!<单精度浮点数(32位长度)typedefdoublefp64;//!<双精度浮点数(64位长度)3C语言内存分配方式在标准C语言中,编译后的可执行程序分为代码区(text)、数据区(data)和未初始化数据区(bss)三部分。下面代码#includeinta=0;//a在全局初始化数据区char*p1;//p1在BSS区(未初始化的全局变量)voidmain(){intb;//b是在栈区intc;//C是全局(静态)数据,存在于初始化数据区chars[]="abc";//s是数组变量,存在栈区,char*p2,*p3;//p2,p3在栈区p2=(char*)malloc(10);//分配的10字节区在堆区p3=(char*)malloc(20);//分配了20bytes的区域在堆区中free(p2);free(p3);}用linux编译后得到的可执行文件如下,可以看到代码区(text)、数据区(data)和未初始化数据区(bss)。代码段(文本):存放代码的地方。只能访问,不能修改。代码段是程序的可执行部分。直观理解,代码段是由函数栈组成的。数据段(data):存放全局变量和静态局部变量的地方。又称数据区、静态数据区、静态区:数据段就是程序中的数据,直观的理解就是C语言程序中的全局变量。注意是全局变量还是静态局部变量,局部变量不算。未初始化数据区(bss):bss段的特点是初始化为0,bss段本质上是一个数据段。那么问题来了,为什么要区分data段和bss段呢?以下面的代码为例,a.c和b.c的区别在于arr数组是否赋值。可见a.out的bss段大,b.out的data段大。但是b.out的文件大小明显大于a.out。那么可以简单理解为data段会增加可执行文件的大小,而bss段则不会。这里我说说我自己的理解。没有找到资料验证:数据段是一个全局变量,但是需要初始化值。在上面的例子中,所有的初始值都是1,但也可能是1024*1024个不同的数据,而这些数据是需要保存的,性能需要保存在可执行文件中。bss段也是一个全局变量,但是不需要初始化值,只保存所有变量的数据类型和大小。即使它的数组容量是1024*1024,也不会占用太多的可执行文件大小。这里还有一个问题:如果所有的变量都初始化为0,那么它也是bss段,而不是data段,即使在你的代码中初始化为0。这个你可以自己验证。关于数据段,即数据段,也会分为RO数据(只读数据段)和RW数据(读写数据段)。它们的含义可以从字面意思来区分。区别在于:只读数据段:程序使用的一些数据,不会被改变。使用这些数据的方式类似于查表操作。由于这些变量不需要改变,所以只需要放在只读存储器中即可。读写数据段:程序中的数据可以被改变和初始化,所以需要防止在RAM中,将初始化后的内容放在内存中(表现为放在可执行文件中)。这样就可以划分出只读区和读写区,如下图(当然bss段和后面的栈也是读写区)。上面说“编译后的可执行程序分为代码区(text)、数据区(data)和未初始化数据区(bss),那么在运行的时候还会多一些区域。这就是我们所说的栈。注意栈是两个区域:堆和栈栈:局部变量和函数一般都在栈空间自动分配&运行时自动回收:栈是自动管理的,不需要程序员人工干预。方便简单,是预先分配的连续地址空间,栈的增长方向是向下的,即内存地址递减的方向堆:堆内存管理器管理着大量的操作系统内存块。每个进程都可以按需申请使用,用完后释放。程序手动申请&释放:手动的意思是需要自己写代码申请malloc和releasefree。可以是非连续的地址空间。gr堆的流向是向上的,即内存地址递增的方向。下面是一个简单的演示代码#include#includeintbss_var;//未初始化的全局数据存放在BSS区intdata_var=42;//初始化的全局数据存放在数据区intmain(intargc,char*argv[]){char*p,*b;printf("Adrbss_var:0x%x\n",&bss_var);printf("Adrdata_var:0x%x\n",&data_var);printf("the%sisatadr:0x%x\n","main",&main);p=(char*)alloca(32);//从栈中分配空间if(p!=NULL){printf("thepstartisatadr:0x%x\n",p);printf("thependisatadr:0x%x\n",p+31);}b=(char*)malloc(32*sizeof(char));//从堆中分配空间if(b!=NULL){printf("thebstartisatadr:0x%x\n",b);printf("thebendisatadr:0x%x\n",b+31);}free(b);//释放requestedspacetoAvoidmemoryleakswhile(1);}运行结果如下内存分配示意图如下