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
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6074

    文章

    45340

    浏览量

    663480
  • keil
    +关注

    关注

    69

    文章

    1224

    浏览量

    171807

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    怎么学好单片机

    编译出来的CODE比较空间,一般用于移植性通用型要求高的嵌入式软件领域,或者比较大的单片机项目,或者要求开发速度而对价格不敏感的产品。而汇编刚好相反,对利润薄,成本低,开发难度不大的行业使用,比如
    发表于 12-04 07:16

    变量控件实验

    目录1、实验目的2、实验设备3、实验步骤3.1新建工程3.2新建画面3.3添加控件3.4模拟工程3.5硬件验证1、实验目的单片机或PLC的串口与智能显示卡相连驱动大尺寸VGA显示器或电视机进行
    的头像 发表于 11-20 15:04 520次阅读
    <b class='flag-5'>变量</b>控件实验

    Keil中使用J-Link attach到正在运行的代码中

    一、设置验证变量 使用 SDK 例程 igpio_led_output,为了便于验证,定义全局变量 count,在 while(1) 中累加。 图 1 二、设置
    发表于 11-19 06:54

    嵌入式与单片机定义及区别

    、SRAM、Flash存储器及其他必要模块集成在一块芯片上。这种超大规模集成电路技术使得单片机变得既小巧又强大,能够轻松应对各种复杂的计算和控制任务。 然而,“单片机”这个名称其实源自于早期的半导体
    发表于 11-17 08:11

    C语言开发单片机为什么大多数都采用全局变量的形式?

    单片机的芯片资源从来都是 “精打细算” 的级别,CPU 主频普遍不高,RAM 总容量本就紧张,分给栈空间的更是少得可怜。要是像普通软件那样,依赖函数返回值传递数据、频繁用局部变量周转,一二去占用
    的头像 发表于 11-12 14:29 224次阅读
    C语言开发<b class='flag-5'>单片机</b>为什么大多数都采用全局<b class='flag-5'>变量</b>的形式?

    请问rt-thread studio如何想keil一样在线查看变量

    rt-thread studio如何想keil一样在线查看变量?是我操作不对吗?还是本来就没有这个功能?
    发表于 09-17 06:07

    怎么测单片机系统频率

    单片机系统频率是指单片机工作时的时钟频率,它直接影响单片机的运行速度和处理能力,准确测量系统频率对单片机应用开发、程序调试和性能优化具有重要意义。测量
    的头像 发表于 07-25 11:39 474次阅读

    单片机怎么驱动电机?

    在各类自动化设备和智能装置中,电机是重要的执行部件,而单片机作为控制核心,需要通过特定的方式驱动电机运转。单片机驱动电机并非直接连接即可,而是要根据电机类型和功率,搭配合适的驱动电路,才能实现稳定
    的头像 发表于 07-25 09:31 438次阅读

    单片机怎么烧程序

    单片机烧程序是将编写好的程序代码写入单片机内部存储单元,让单片机按照预设逻辑工作的过程,是单片机应用开发中不可或缺的环节。无论是简单的灯光控制程序,还是复杂的工业控制算法,都需要通过烧
    的头像 发表于 07-23 11:47 650次阅读

    怎样学会单片机

    想学会单片机其实没那么复杂,先把心态放平稳,别被那些五花八门的名词吓住。一开始就得把 C 语言基础打扎实,位操作、指针、函数这些概念必须吃透,尤其是指针,单片机里操作寄存器、外设经常要用到,搞不懂
    的头像 发表于 07-23 10:23 456次阅读
    怎样学会<b class='flag-5'>单片机</b>?

    基于Keil开发瑞萨RA8单片机

    这两年单片机行业也开始卷起来了,各大厂商纷纷推出各种高性能的单片机
    的头像 发表于 05-07 10:33 1164次阅读
    基于<b class='flag-5'>Keil</b>开发瑞萨RA8<b class='flag-5'>单片机</b>

    瑞萨RA8系列教程 | 基于 Keil 开发 RA8单片机

    本文结合瑞萨Cortext-M85单片机RA8D1、Keil MDK,以及瑞萨自家的代码初始化工具(Smart Configurator)给大家描述一下,快速在Keil MDK上点亮Cortext-M85
    的头像 发表于 04-22 17:41 1051次阅读
    瑞萨RA8系列教程 | 基于 <b class='flag-5'>Keil</b> 开发 RA8<b class='flag-5'>单片机</b>

    如何使用PN7制作具有5180字节UID的身份验证mifare plus?

    我正在开发的读卡器使用 PN5180。 我想读取 7 字节 UID 的 Mifare Plus ev1 卡 但 PN5180数据表仅解释了4字节 UID 卡。 如何使用 PN7 制作具有 5180 字节 UID 的身份
    发表于 04-01 06:37

    单片机Debug工具性能对比 单片机调试常用命令

    。以下是对单片机调试工具性能的简要对比以及一些常用的调试命令。 单片机Debug工具性能对比 Keil uVision 性能 :Keil uVision 是一款功能强大的集成开发环境(
    的头像 发表于 12-19 09:56 2162次阅读

    单片机Debug与仿真区别

    单片机的开发是一个复杂的过程,涉及到硬件设计、软件开发和测试等多个环节。为了确保单片机能够按照预期工作,开发者需要使用Debug和仿真技术检测和修正代码中的错误。 Debug(调试) Debug
    的头像 发表于 12-19 09:47 1402次阅读