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

发布者:Howard_Sun最新更新时间:2023-10-04 来源: elecfans关键字:单片机  变量 手机看文章 扫描二维码
随时随地手机看文章

首先问大家两个问题:

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

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

我敢说很多人都不知道,或者存在疑惑。具体占多少字节,其实通过手动验证一下就知道了。 今天结合Keil C51AT89C51),以及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来验证单片机变量占多少字节

上一篇:基于AT89C51的电流源设计
下一篇:单片机C语言教程第二课-初步认识51芯片

推荐阅读最新更新时间:2024-11-10 17:36

大联大友尚推出符合标准的TI Hercules MCU
2015年5月5日,致力于亚太地区市场的领先半导体元器件分销商---大联大控股宣布,其旗下友尚代理的德州仪器 (TI)的Hercules TMS570LS12x/11x 与 RM46x 微控制器已经过 T V S D 的认证,符合 ISO 26262 (2011版) 与 IEC 61508 (2010版) 对安全完整性等级 ASIL D 和 SIL 3 的功能安全标准的相关要求。通过该标准将有助于OEM厂商大幅缩短终端产品通过上市认证所需时间。此外,大联大友尚还同时推出两款TI全新的 LaunchPad 开发工具包,为开发人员评估MCU的功能安全特性和效能提供了低成本的选择。 图示1-大联大友尚代理的TI
[嵌入式]
大联大友尚推出符合标准的TI Hercules  <font color='red'>MCU</font>
27课:关于单片机的一些基本概念
随着电子技术的迅速发展,计算机已深入地渗透到我们的生活中,许多电子爱好者开始学习单片机知识,但单片机的内容比较抽象,相对电子爱好者已熟悉的模拟电路、数字电路,单片机中有一些新的概念,这些概念非常基本以至于一般作者不屑去谈,教材自然也不会很深入地讲解这些概念,但这些内容又是学习中必须要理解的,下面就结合本人的学习、教学经验,对这些最基本概念作一说明,希望对自学者有所帮助。 一、总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以就需要
[单片机]
MCU客户追单 超丰阳性率低产能一直运作
IC封测厂超丰电子7日完成4264名全体员工快筛,由于阳性率不高,公司未规划2次快筛,产能持续运作,以应MCU和车用电子客户的追单需求。 据超丰上午接受当地媒体采访时透露,7日已经完成全体员工4264名(包括外籍移工约千名)的快筛作业,其中有15例确诊,外籍移工12例、本地员工3例。由于阳性率不高,超丰表示没有规划2次快筛作业。 从客户端来看,超丰指出由于市场需求强劲,MCU和汽车电子客户持续追单,今年至5月订单持续满载,稼动率也接近100%,预估订单能见度可看到第三季度。 《经济日报》援引业内指出,超丰负责国内外多家大厂包括Wi-Fi芯片、蓝牙芯片、MCU、电源管理芯片等封测,客户以本地MCU、网络芯片设计厂、存储器控芯片厂、触
[手机便携]
STC单片机程序下载问题及解决方法
失败现象: Chinese:正在尝试与 MCU/单片机 握手连接 ... 打开串口失败! Chinese: 串口已被其它程序打开或该串口不存在。 解决方法: 1,检查USB下载模块的连接是否正常,模块上的绿色和红色LED灯都亮起表示连接正常。绿色LED灯不亮表示USB驱动程序出现问题,可以拔下USB模块重插一次。红色LED灯不亮表示模块没有供电,或是USB模块后面的电源输出端(3.3V、+5V、GND)有短路。 2,在控制面板---》系统---》硬件管理器中找到“端口”---》CP2101串口,了解括号里的 COM号。如果括号里显示COM4,那在STC-ISP软件里也要选择COM4才行。 STC-ISP软件: 3,
[单片机]
8051单片机教程第十二课:逻辑运算类指令
对累加器A的逻辑操作: CLRA;将A中的值清0,单周期单字节指令,与MOVA,#00H效果相同。 CPLA;将A中的值按位取反 RLA;将A中的值逻辑左移 RLCA;将A中的值加上进位位进行逻辑左移 RRA;将A中的值进行逻辑右移 RRCA;将A中的值加上进位位进行逻辑右移 SWAPA;将A中的值高、低4位交换。 例:(A)=73H,则执行CPLA,这样进行: 73H化为二进制为01110011, 逐位取反即为10001100,也就是8CH。 RLA是将(A)中的值的第7位送到第0位,第0位送1位,依次类推。 例:A中的值为68H,执行RLA。68H化为二进制为01101000,按
[单片机]
采用单片机的智能照明控制器电路模块设计
   电路原理 :路由二极管VD1~VD4组成桥式整流电路,再经R1限流,C1滤波,VD6稳压获得 10V 直流电压,为7555定时器提供电源。7555定时器和R4、C2构成单稳态触发器。暂稳态持续时间T=1.1R4C2=50。VS是晶闸管,控制灯的亮、灭。其工作原理是:白天当光线照射到光敏电阻RG时,其阻值变得很小,按动按钮SB,7555的2端不能产生幅度低于VCC/3的触发负脉冲,故不能使 7555的3端输出高电平来触发VS使它导通,电灯HL不亮。晚上:RG阻值变大,当按按钮SB时,7555的2端产生了低于 VCC /3的低电平脉冲,从而使7555定时器的3‘端输出约50s的高电平,它触发VS的控制端,使VS导通,电灯亮。50
[电源管理]
采用<font color='red'>单片机</font>的智能照明控制器电路模块设计
AVR单片机串口详解
一.熟悉AVR单片机UART资源,首先从波特率和帧说起 波特率:与51不同有单独的波特率发生器,不需要定时器来产生,节省了资源 波特率计算公式,这里我采用IccAVR的配置功能,直接计算生成 单片机支持的模式:异步正常模式,异步倍数模式,和同步模式,一般选第一种模式 帧格式:起始位+数据位(5-9位可选)+校验位(可选)+停止位(1、2位) 空闲 o ********* P 1 1 通讯电路空闲时为高电平 二、大概了解了下硬件资源后,就要了解软硬件的桥梁 寄存器了
[单片机]
单片机C语言C51的数据类型
C51的数据类型分为基本数据类型和组合数据类型,情况与标准C中的数据类型基本相同,但其中char型与short型相同,float型与double型相同,另外,C51中还有专门针对于51单片机的特殊功能寄存器型和位类型。 一.字符型char 有signed char和unsigned char之分,默认为signed char。它们的长度均为一个字节,用于存放一个单字节的数据。 对于signed char,它用于定义带符号字节数据,其字节的最高位为符号位,“0”表示正数,“1”表示负数,补码表示,所能表示的数值范围是-128~+127; 对于unsigned char,它用于定义无符号字节数据或字符,可以存放一个字节
[单片机]
<font color='red'>单片机</font>C语言C51的数据类型

推荐帖子

有谁在CE下用过NdisMCmRegisterAddressFamily?
有谁在CE下用过NdisMCmRegisterAddressFamily?请问在CE下面能调用NdisMCmRegisterAddressFamily吗?有谁在CE下用过NdisMCmRegisterAddressFamily?
草履虫 嵌入式系统
既然可以用AD9851代替AD9854,那
本帖最后由paulhyde于2014-9-1503:35编辑那AD9850可以代替AD9851,那可不可以用AD9850呢?听说要做正交,两片AD9851能实现的,AD9850两片也可以吧?请问能用AD9850吗?比AD9851便宜好多啊既然可以用AD9851代替AD9854,那本帖最后由paulhyde于2014-9-1503:36编辑AD9850最高主频只有125M,而且不带PLL本帖最后由paulhyde于2014-9
电子无聊大神 电子竞赛
单片机输出脉冲信号控制步进电机驱动器
请教各位,那位说说单片机输出脉冲信号,控制步进电机加减速。说说编程思路。请大家踊跃讨论。单片机输出脉冲信号控制步进电机驱动器这块相对来说比较简单,首先你要看你使用的步进电机是几相几线的,然后角度多大,有时间看看资料,很简单的,控制多大角度,线距,速度都可以有PWM输出引脚的可以直接进行设置,如果没有,那么通过定时器对引脚的高低电平进行设置就可以啊支持楼上两位,的确是这两种思想。要不你用带控制器的呗,就是贵点。差不多最便宜的控制器150多吧,我上次用欧姆龙的500多。不过控制起来占用资源
conghaisheng 单片机
求助文件系统移植到pic18f**20中遇到的问题
ErrorE:\\SD_example\\copy\\SD\\sd.c;2.18can\'topenincludefile\"pic18.h\":Toomanyopenfiles这个头文件我已经包含了,而且在其他模块编译中能够找到这个头文件,可到文件系统对SD卡操作这一块,就出现上面的错误,不知道为什么,求助求助文件系统移植到pic18f**20中遇到的问题
sd6863959 Microchip MCU
C5000编译SUBC指令实现除法
通过编程求解y=(ax^2-bx+c)/(dx+e),将商和余数分别放在数据存储器1000H和1001H单元。(1)已知a=8,b=6,c=10,d=7,e=9,x=5,求y。(2)已知a=0.9,b=0.1,c=0.5,d=0.4,e=0.2,x=0.8,求y。.titledivision.asm.mmregsY.usectY,10H;若程序中要使用堆栈,必须先进行设置X.use
Aguilera 微控制器 MCU
解决STM32CubeMX打开MotorControl Workbench工程时报错
报错:(这个报错在解决STM32CubeMX+MotorControlWorkbench+keil生成空白工程的问题-电机驱动控制(MotorControl)-电子工程世界-论坛中已经解决,优先看这个链接,实在不行再看本贴)本人使用STM32CubeMX6.12.1打开MotorControlWorkbench6.3.2工程时产生了下面报错:CannotaddmiddlewareMotorControl:con
wyy1937176 电机驱动控制(Motor Control)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved