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

关注+星标公众,不错过精彩内容

ca529727f0db939904bb6a013df657df.jpeg

作者 | strongerHuang

微信公众号 | 嵌入式专栏

最近看到群友在讨论【单片机变量存储大小由什么决定?】的话题。

比如:int、long int 有多大?结构体占多大空间?

描述

在实际情况中,不同的处理器架构、操作系统、以及编译器等都不是决定整形变量大小的关键因素,比如:51、ARM、x86、x64等不同的处理器架构,FreeRTOS、 Linux、Windows等不同的操作系统,gcc、AC、clang等不同编译器。

主要是处理器位数决定。(当然,目前我验证过的所有情况是由处理器位数决定,其他决定性因素有待考证)

首先,整型变量大小由编译器(编译)得来,而编译器首先会考虑编译环境(这个环境主要是CPU的位数)。

之前给大家分享过《用Keil验证8位和32位单片机变量占用空间大小》,其中就体现了8位和32位CPU中变量占用空间的大小。

验证

之前分享《用Keil验证8位和32位单片机变量占用空间大小》的内容,主要在Keil这个编译环境下,通过编译大小验证。

这其中是想描述Keil环境下CPU位数,以及大小端对变量占用空间大小的影响。

而最直接的办法则是通过sizeof得出大小,打印出来。

这里额外提一下sizeof 和 sizeof 的区别:

  • sizeof通常计算变量大小,strlen计算字符串长度

  • sizeof是运算操作符,strlen是函数

  • sizeof在编译的时候得出大小,strlen要考虑’\0字符的长度

例子源代码:

#include <stdio.h>


int main(void)
{
  printf( "         char: %d\n" , sizeof(char));
  printf( "    short int: %d\n" , sizeof(short int));
  printf( "          int: %zd\n" , sizeof(int));
  printf( "     long int: %d\n", sizeof(long int));
  printf( "long long int: %d\n", sizeof(long long int));
  printf( "        float: %d\n", sizeof(float));
  printf( "       double: %d\n", sizeof(double));


  return 0;
}

大家可以试着用不同的编译环境试试上面这部分代码,看看有什么差别。

这里简单举例两个:

1.Keil  MDK编译,直接下载在STM32中串口打印输出。

9df95927082ed647155b28c73e38862b.png

串口输出结果:

char: 1
    short int: 2
          int: 4
     long int: 4
long long int: 8
        float: 4
       double: 8

4c680942d5264d1fc4fe465c2b1e23d6.png

2.在线编译器

这里我用的在线编译器,网址:

https://rextester.com/l/c_online_compiler_gcc

(复制到浏览器直接打开即可)

gcc编译:

6cb121b4871beebe13a456ca3098fdaf.png

clang编译:

19ffbeeb596d8b45526e7e9e0a845406.png

以及其他环境,输出情况都一样,因为是在同一台电脑(操作系统、CPU位数都一样)。

char: 1
    short int: 2
          int: 4
     long int: 8
long long int: 8
        float: 4
       double: 8

如果你换到平台,可能结果就不一样了。通过对比各种结果,你自然会得出结论。

大家可以试试其他编译环境,在线编译器的话,可以参看我之前的推文:多款优秀的支持C、C++等多种语言的在线编译器

更多软件工具,推荐阅读:软件工具、 编译器、 编辑器

------------ END ------------

942b23e67220877f171ed8d046644ffc.gif

●专栏《嵌入式工具

●专栏《嵌入式开发》

●专栏《Keil教程》

●嵌入式专栏精选教程

关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

3110514372e87ed6cb05ed5b29f454ce.jpeg

a3ed02cc00ecbdf4c54f5568aeecc11c.png

点击“阅读原文”查看更多分享。