首先问大家两个问题:
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;
};
这里面还有很多细节内容,可能很多人都没有深入研究过,感兴趣的朋友可以自己实验研究一下。
上一篇:基于AT89C51的电流源设计
下一篇:单片机C语言教程第二课-初步认识51芯片
推荐阅读最新更新时间:2024-11-10 17:36
推荐帖子
- 有谁在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)
设计资源 培训 开发板 精华推荐
- LTC2995 的典型应用 - 具有警报输出的温度传感器和双电压监视器
- 用于手机的 3V 模拟放大
- NCV78702R1GEVK:NCV78702 QFN 套件
- 300mA 高速、极低噪声 CMOS LDO 稳压器的典型应用
- 使用 ON Semiconductor 的 LM4040ESD-300GT3 的参考设计
- UMFT231XC-01,UMFT231XC USB转UART开发模块,支持电池充电器
- LT1172IS8、5V/1.25A 正降压转换器的典型应用
- Cree XLamp CXA3050 LED 壁挂灯参考设计
- LT1172CS8、5V/1.25A 升压转换器的典型应用
- TD6304AP双极数字集成电路单片典型应用