最近看到群友在讨论【单片机变量存储大小由什么决定?】的话题。
比如: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字符的长度
例子源代码:
#includeintmain(void) { printf( " char: %d " , sizeof(char)); printf( " short int: %d " , sizeof(short int)); printf( " int: %zd " , sizeof(int)); printf( " long int: %d ", sizeof(long int)); printf( "long long int: %d ", sizeof(long long int)); printf( " float: %d ", sizeof(float)); printf( " double: %d ", sizeof(double)); return 0; }
大家可以试着用不同的编译环境试试上面这部分代码,看看有什么差别。
这里简单举例两个:
1.Keil MDK编译,直接下载在STM32中串口打印输出。
串口输出结果:
char: 1 short int: 2 int: 4 long int: 4 long long int: 8 float: 4 double: 8
2.在线编译器 这里我用的在线编译器,网址: https://rextester.com/l/c_online_compiler_gcc (复制到浏览器直接打开即可) gcc编译:
clang编译:
以及其他环境,输出情况都一样,因为是在同一台电脑(操作系统、CPU位数都一样)。
char: 1 short int: 2 int: 4 long int: 8 long long int: 8 float: 4 double: 8如果你换到平台,可能结果就不一样了。通过对比各种结果,你自然会得出结论。
审核编辑:汤梓红
-
处理器
+关注
关注
68文章
19155浏览量
229057 -
单片机
+关注
关注
6032文章
44513浏览量
632714 -
keil
+关注
关注
68文章
1211浏览量
166661 -
编译器
+关注
关注
1文章
1618浏览量
49043
原文标题:单片机变量存储大小由什么决定?
文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论