如何用Keil来验证单片机变量占多少字节

发布时间:2023-05-24  

首先问大家两个问题:

8位单片机定义一个int型变量,占几个字节?

32位单片机定义一个char型变量,占几个字节?

我敢说很多人都不知道,或者存在疑惑。具体占多少字节,其实通过手动验证一下就知道了。 今天结合Keil C51(AT89C51),以及Keil MDK(STM32)为大家验证一下 char、short、int、float、double 到底占几字节空间。

Keil C51、8位单片机


这一节基于Keil C51工具,8位单片机(AT89C51)进行测试。

//char a;


void main(void)

{

  while(1)

  {

  }

}

这是一个很简单的Demo,只针对变量占用空间大小进行测试,主要是对比data的大小,初始值为9。(其中系统【启动文件】占用了9字节RAM空间) 1.char占1字节

定义变量:


char a;

编译结果:


Program Size: data=10.0 xdata=0 code=17

2.short占2字节

定义变量:


short a;

编译结果:


Program Size: data=11.0 xdata=0 code=17

3.int占2字节

定义变量:


int a;

编译结果:


Program Size: data=11.0 xdata=0 code=17

4.float占4字节

定义变量:


float a

编译结果:


Program Size: data=13.0 xdata=0 code=17

5.double占4字节

定义变量:


double

编译结果:


Program Size: data=13.0 xdata=0 code=17

Keil MDK、32位单片机


这一节基于Keil MDK工具,32位单片机(STM32)进行测试。

//char a;



int main(void)

{

  while(1)

  {

//    a++;

  }

}

这也是一个很简单的Demo,主要是对比RW-data的大小,初始值为0。(其中 ZI-data=1024 为系统分配的栈空间大小) 1.char占1字节

定义变量:


char a;

编译结果:


Program Size: Code=512 RO-data=436 RW-data=4 ZI-data=1028

啥?占了4个字节? 答案:只占了一个字节,因为32位机是4字节为一个“单元”,一个 char 只占用了其中1字节(类似结构体占用空间大小,这里还牵涉到大小端对齐模式)。 再举一个例子:定义4个 char型变量,还是占用4字节空间(short原理一样)再次提示:

注意4字节为一个“单元”,超过这个单元就分配到“下一个单元”,比如:


char a;

int b;

char c;

这里就会占用12(3 * 4)字节空间(a、b、c各自占4字节)。


2.short占2字节

定义变量:


short a;

编译结果:


ProgramSize:Code=512RO-data=436RW-data=4ZI-data=1028

这里和 char 类似,如果定义两个 short 也是占用4个字节。 3.int占4字节

定义变量:


int a;

编译结果:


ProgramSize:Code=512RO-data=436RW-data=4ZI-data=1028

32位机,int占用4字节没什么说的。 4.float占4字节

定义变量:


float a;

编译结果:


ProgramSize:Code=520RO-data=436RW-data=4ZI-data=1028

5.double占8字节

定义变量:


double a;

编译结果:


ProgramSize:Code=1156RO-data=436RW-data=8ZI-data=1024

总结


上面验证情况在Keil C51、 8位单片机(AT89C51)中:

char:占1字节


short、int:占2字节


float、double:占4字节


在Keil MDK、 32位单片机(STM32)中:

char:占1字节


short:占2字节


int、float:占4字节


double:占8字节


通过对比上面几个变量,以及编译结果,得出一些结论。 1.变量占多少字节,与处理器(以及编译器)有关; 2.浮点数运算更占代码空间,且double比float更占空间。上面基于32位机中进行了a++;运算,明显float、double打码量(code)更大。 3.变量数据对齐规则和结构体一样。经典的面试题:计算下面结构体占用多少字节?

struct Str

{

  char a;

  short b;

  int c;

  char d;

};

这里面还有很多细节内容,可能很多人都没有深入研究过,感兴趣的朋友可以自己实验研究一下。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    如何用Keil来验证单片机变量占多少字节;首先问大家两个问题: 8位单片机定义一个int型变量,占几个字节? 32位单片机定义一个char型变量,占几个字节? 我敢说很多人都不知道,或者......
    输出重定向到串口输出 输出串口数据过程中,需要向寄存器逐字节传入数据的,而在传送之前必不可少的,就是将要发送的数据、字符放到同一个Buffer后,执行轮询的方式传送直到buffer内容全部被传送。 而这......
    一样,都是发送后才进中断,需要在发送函数中先发送一个字节触发中断。发送函数如下 /******* 功能:中断方式发送字符串。采用判断TC的方式。即 判断 发送后中断 位。 输入:字符串的首地址 输出......
    区)(static):全局变量和静态变量的是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 4. 文字常量区:常量字符串就是放在这里的。  5......
    类型数组来处理的,在存储字符串时系统会在字符串尾部加上o 转义字符以作为该字符串的结束符。字符串常量“A”和字符常量‘A’是不一样的, 前者在存储时多占用一个字节的字间。(5)位标量,它的值是一个二进制。 2、应用......
    收发数据的格式是由数据帧构成。数据帧一般包括开始标志、数据段、校验段和结束标志等部分。开始标志用于表示一帧数据的开始位置,通常是一个字节或几个字节的特殊字符;数据段是实际传输的数据部分;校验......
    USART1_Send_Byte(u8 Data) //发送一个字节;   {   USART_SendData(USART1,Data);   while( USART_GetFlagStatus(USART1......
    的数据。(仅在一些PLC品牌中支持)   3. 字符串转换   将一个字符串类型转换成另一个字符串类型,通常使用以下语句:   CONCATENATE:将多个字符串拼接成一个字符串......
    font_init(void) { get_lcd_params(&fb_base, &xres, &yres, &bpp); } 2.显示字符串 如果想显示字符串,那就在每显示完一个字符......
    (void) {     get_lcd_params(&fb_base, &xres, &yres, &bpp); } 2.显示字符串 如果想显示字符串,那就在每显示完一个字符......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>