C语言现在越来越多的用在了嵌入式中,即使在很多8位MCU(单片机)中也是如此,当然,对于32位的MCU或CPU,就很难想像有人不用C语言作开发,汇编语言只在初始化C堆栈时使用到,其它情况下很少会使用汇编在32位甚至在64位架构上开发,
C中各种常见数据类型变量所占用的存储空间依赖于编译器和MCU/CPU架构:现对不同的架构上的数据类型以实例作说明,下面用临时写的函数data_type_test作具体说明.
void data_type_test(void)
{
char chData = 0;/* */
char *pch = &chData;
char *pstr = "str";
short sData = 0;
short *ps = &sData;
int iData = 0;
int *pi = &iData;
long lData = 0;
long *pl = &lData;
int ch_type_len = 0;
int pch_type_len = 0;
int pstr_type_len = 0;
int s_type_len = 0;
int ps_type_len = 0;
int i_type_len = 0;
int pi_type_len = 0;
int l_type_len = 0;
int pl_type_len = 0;
ch_type_len = sizeof(chData);
pch_type_len = sizeof(char *);
pstr_type_len = sizeof(char *);
s_type_len = sizeof(sData);
ps_type_len = sizeof(ps);
i_type_len = sizeof(iData);
pi_type_len = sizeof(pi);
l_type_len = sizeof(lData);
pl_type_len = sizeof(pl);
}
函数 data_type_test 中列举了C语言中最常用的四种整形数据类型 char short int long变量所占用的内存空间大小(以字节为单位)情况,
该函数在不同的MCU/CPU下计算出的大小一般是不同的.
在8位的MCU下,因为MCU的内存通常不直接叫内存,而是叫SRAM,一般都比较小,多的可能超过256字节,少的即小于256字节,这样不同的MCU并结合支持该MCU的编译器,对几种整形变量所分配的空间是不一样的.
1. 在MCU PIC16F877 + HI-TECH PICC编译器中,各变量值如下:
Address Symbol Name Value
020 pch 0x3825
021 pi 0x3C38
022 pl 0x3A3C
023 ps 0x083A
024 pstr 0x0008
025 chData 0x00
026 ch_type_len 0x0001
028 i_type_len 0x0002
02A l_type_len 0x0004
02C pch_type_len 0x0001
02E pi_type_len 0x0001
030 pl_type_len 0x0001
032 ps_type_len 0x0001
034 pstr_type_len 0x0001
036 s_type_len 0x0002
038 iData 0x0000
03A sData 0x0000
03C lData 0x00000000
2. 在MCU PIC18F84520 + HI-TECH PICC18编译器中,各变量值如下:
Address Symbol Name Value
40D iData 0x0000
40F pi 0x040D
411 lData 0x00000000
415 pl 0x0411
417 ch_type_len 0x0001
419 pch_type_len 0x0002
41B pstr_type_len 0x0002
41D s_type_len 0x0002
41F ps_type_len 0x0002
421 i_type_len 0x0002
423 pi_type_len 0x0002
425 l_type_len 0x0004
427 pl_type_len 0x0002
3. 在32位CPU或MCU下:
iData = 0
pi = 4
lData = 4
pl = 4
ch_type_len = 1
pch_type_len = 4
pstr_type_len = 4
s_type_len = 2
ps_type_len = 4
i_type_len = 4
pi_type_len = 4
l_type_len = 4
pl_type_len = 4
由此可见, 在不同的MCU/CPU中, 常见数据类型 char short int long 中,它们所占用的存储空间是不同的.
所以在没有前提(MCU/CUP+编译器)下,问sizeof(char *) 或 sizeof(int) 是多少时, 它们是不确定的问题,必须在
相应的MCU/CPU及所支持的编译器下,才是确定的结果. 而且有些编译器还有支持指定int型为2字宽度或4字节宽度的编译选项.