0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Q4MP_gh_c472c21 来源:strongerHuang 作者:strongerHuang 2021-10-29 10:20 次阅读

首先问大家两个问题:
  • 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;};
这里面还有很多细节内容,可能很多人都没有深入研究过,感兴趣的朋友可以自己实验研究一下。
责任编辑:haq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    5992

    文章

    43911

    浏览量

    619664
  • keil
    +关注

    关注

    68

    文章

    1193

    浏览量

    165168

原文标题:用Keil验证8位和32位单片机变量占用空间大小

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    单片机RAM不够用怎么解决?

    来自一位用户的咨询,麻烦帮忙解答。越详细越好,有图有真相。如有相关的视频、文档也可以辅助说明,谢谢。 单片机RAM不够用怎么办? 单片机都有RAM,如果我们一下子定义了一大堆的变量,使得变量
    发表于 02-02 07:35

    单片机变量存储大小由什么决定?

    最近看到群友在讨论【单片机变量存储大小由什么决定?】的话题。
    的头像 发表于 01-26 10:11 237次阅读
    <b class='flag-5'>单片机变量</b>存储大小由什么决定?

    keil arm工程中结构体1字节对齐如何实现

    Keil Arm工程中,结构体的对齐方式可以通过使用特定的编译器指令或者关键字来实现。结构体的对齐方式会直接影响结构体变量在内存中的布局和对齐边界,从而对程序的性能和存储空间占用产生影响。 结构
    的头像 发表于 01-05 14:40 787次阅读

    单片机Keil开发环境的搭建

    欢迎大家来到C语言单片机编程课堂。前面一课我们了解了单片机编程与嵌入式开发内容,这节课我们来学习单片机开发环境Keil,并使用keil完成
    的头像 发表于 11-01 09:17 723次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>Keil</b>开发环境的搭建

    51单片机中unsigned short多少字节

    51单片机中unsigned short多少字节
    发表于 10-27 07:02

    单片机何用按键输入汉字?

    单片机何用按键输入汉字
    发表于 10-26 08:23

    单片机位带牵涉的指针变量问题

    单片机位带牵涉的指针变量问题
    的头像 发表于 09-27 15:18 280次阅读
    <b class='flag-5'>单片机</b>位带牵涉的指针<b class='flag-5'>变量</b>问题

    何用单片机控制220V交流电的通断?

    何用单片机控制220V交流电的通断?
    的头像 发表于 09-18 10:59 2493次阅读
    如<b class='flag-5'>何用</b><b class='flag-5'>单片机</b>控制220V交流电的通断?

    如何创建51单片机KEIL工程步骤

    1. 什么是Keil软件 Keil软件是一款专为嵌入式系统开发而设计的集成开发环境(IDE),常用于51、STM32单片机软件开发的编程软件。Keil编程软件不仅支持多种工具和扩展程序
    的头像 发表于 09-11 10:49 1419次阅读
    如何创建51<b class='flag-5'>单片机</b><b class='flag-5'>KEIL</b>工程步骤

    怎么将STC单片机添加到keil选型表呢?

    对于很多初学者来说,刚开始接触51单片机时可能是使用proteus等仿真软件进行仿真学习的,在建立keil工程时也是选用课本上对应的51单片机型号进行编程。
    发表于 07-31 14:37 966次阅读
    怎么将STC<b class='flag-5'>单片机</b>添加到<b class='flag-5'>keil</b>选型表呢?

    何用不同方法验证单片机变量的大小呢?

    有人说单片机开发很简单,也有人说很难。
    发表于 06-26 09:11 476次阅读
    如<b class='flag-5'>何用</b>不同方法<b class='flag-5'>验证</b><b class='flag-5'>单片机变量</b>的大小呢?

    定义了一个64K字节的数组,如果把数组定义成变量数组运行不了怎么解决?

    我定义了一个64K字节的数组,如果把数组定义成Const常量,编辑之后运行都正常。 但如果把数组定义成变量数组,可以编译(的空间比较大:Program Size: Code=8776
    发表于 06-13 08:36

    PyTorch教程22.6之随机变量

    电子发烧友网站提供《PyTorch教程22.6之随机变量.pdf》资料免费下载
    发表于 06-06 09:24 0次下载
    PyTorch教程22.6之随<b class='flag-5'>机变量</b>

    何用proc sql生成宏变量

    上节我们讲了PROC SQL的基本结构,以及一些sql命令的使用,这节我们主要讲一下case...when...、order by 、group by 、update、delete语句以及如何用proc sql生成宏变量
    的头像 发表于 05-19 16:13 1420次阅读
    如<b class='flag-5'>何用</b>proc sql生成宏<b class='flag-5'>变量</b>?

    基于STC单片机的前后台操作双字节变量源代码

    STC单片机前后台操作双字节变量源代码
    发表于 05-12 16:20 0次下载