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

    关注

    6068

    文章

    45039

    浏览量

    652462
  • keil
    +关注

    关注

    69

    文章

    1223

    浏览量

    170013

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于Keil开发瑞萨RA8单片机

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

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

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

    32位电机驱动单片机ZH521X产品概述

    ZH521X系列类单片机是一款低功耗,高性能,资源丰富,M0内核的电机控制专用单片机。集成32k字节代码存储器EFLASH、4k字节SRAM。
    的头像 发表于 11-25 14:49 ?933次阅读
    32位电机驱动<b class='flag-5'>单片机</b>ZH521X产品概述

    【蓝桥杯单片机】第二章 开发环境与工具的安装

    本章介绍单片机设计与开发项目的开发环境与工具。以下是所需要安装的软件以及附加的强力卸载软件:下面跟着教程进行开发环境的配置与安装:第一节keil5安装该步骤为下载keil5官方安装包
    的头像 发表于 10-30 08:00 ?1329次阅读
    【蓝桥杯<b class='flag-5'>单片机</b>】第二章 开发环境与工具的安装

    基于51单片机的手动数字时钟

    具体实现功能由51单片机+8位共阴数码管+独立按键构成。具体功能:(1)利用数码管显示时分秒,显示格式为“时-分-秒”;(2)利用6个按键控制时、分、秒,设定好后自动开始时钟显示;(3)设置秒复位
    的头像 发表于 10-22 14:12 ?673次阅读
    基于51<b class='flag-5'>单片机</b>的手动数字时钟

    单片机怎么写入程序

    程序通常涉及以下几个步骤: 选择单片机和开发环境 : 确定项目需求,选择合适的单片机型号。 安装相应的开发环境,如Keil、IAR、MPLAB等。 硬件连接 : 将单片机连接到开发板或
    的头像 发表于 10-21 11:21 ?2537次阅读

    51单片机(一款国产8位高性能Flash的接近感应单片机XD08M3232体验感)

    跟大家分享一下: 第一,这款单片机是使用Keil编译、调试、仿真,对绝大部分工程师来说还是非常熟悉的,好上手,特别方便。 第二,这颗单片机的内存比较大,承载着8K字节的 FLASH、1
    发表于 09-25 15:15

    如何将hex文件烧录进单片机

    :确保你的计算机上安装了适用于你单片机型号的开发环境,如Keil、IAR Embedded Workbench等。以Keil为例,你需要从Keil官网下载并安装适合你
    的头像 发表于 09-02 10:34 ?4925次阅读

    keil可以读出单片机的程序吗

    Keil是一款广泛应用于单片机程序开发的软件,它提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案。然而,关于Keil是否能直接“读出”单片机的程
    的头像 发表于 09-02 10:32 ?2243次阅读

    keil软件怎么运行写好的程序

    Keil软件是一款功能强大的嵌入式开发工具,广泛应用于单片机、ARM、DSP等嵌入式系统的开发。本文将介绍如何使用Keil软件运行写好的程序。 安装Keil软件 首先,需要从
    的头像 发表于 09-02 10:29 ?4669次阅读

    如何提高单片机的运算效率之FPU

    只要STM32或者其他32位单片机,自带FPU功能,就可以加速float类型数据的加减乘除运算。在STM32中要启用FPU,需要启动满足两个宏:(__FPU_PRESENT==1)&&
    的头像 发表于 08-30 11:47 ?1298次阅读
    如何提高<b class='flag-5'>单片机</b>的运算效率之FPU

    Keil变量不被初始化方法

    有些时候在我们的应用过程中要求变量有连续性,或者现场保留,例如Bootloader跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别
    的头像 发表于 08-30 11:47 ?1603次阅读
    <b class='flag-5'>Keil</b>中<b class='flag-5'>变量</b>不被初始化方法

    何用keil单片机烧录程序

    以下是详细的步骤: 安装Keil软件 : 首先,您需要从Keil官网下载适合您单片机型号的MDK-ARM软件。 安装过程中,请按照提示操作,选择适合您的开发板和单片机型号。 创建新项目
    的头像 发表于 08-22 09:28 ?7335次阅读

    51单片机烧录软件怎么用

    准备工作 确保您已经安装了51单片机烧录软件,如Keil、IAR等。 准备好51单片机开发板和烧录器,如STC-ISP等。 确保您的计算机已经安装了相应的驱动程序。 安装烧录软件 从官方网站或可
    的头像 发表于 08-22 09:26 ?2997次阅读