单片机中类型为什么会影响代码空间(CODE MEMORY)?(50分送上)

来源:百度知道 编辑:UC知道 时间:2024/05/25 04:55:34
请教各位单片机高手:
用8051单片机时,在编译成二进制文件过程中为什么全局函数中形参的类型会影响编译后的代码空间(CODE MEMORY)的大小,而不是影响数据空间(XDATA MEMORY)的大小?
例如:void Text(int a)与void Text(char a)编译后代码空间会不一样,数据空间却相同?
谢谢四楼的回答,辛苦了,不过有一点大概我们的理解有偏差,就是关于程序编译后的数据空间,将c代码编译成二进制代码时数据空间中就存了所有全局变量的大小,如char型全局变量占1个字节,int型占2个字节;而我当初是认为全局函数的形参类型也应该向全局变量一样(char型全局变量占1个字节,int型占2个字节)去影响数据空间。

在C语言定义的变量,如int、char等等,定义时看似简单,事实上编译器要花费很大的代码为它们分配存储空间,它们是在R0-R7里按指定的格式分配的。要实现这些分配,就要在C语言编译成汇编语言时转换出许多程序代码。因为在汇编语言里可没有整型、实型、字符型的区别,都是8位的字节形式。C语言转换成汇编时,要为不同的数据类型分配存储空间,还是用程序代码完成的。所以有经验的程序员是尽量避免占据空间大的数据格式。
举例:usinged char型 变量占的空间1字节,但代码的长度为16字节;
char型 变量占的空间1字节,但代码的长度为54字节;
usinged int 型 变量占的空间1字节,但代码的长度为147字节;
long型 变量占的空间1字节,但代码的长度为425字节;
等等。也就是说非得这么多的程序代码,单片机才能把它识别成这种类型的数据。
楼主所说的数据空间的大小是何意?
每种变量占据的数据空间是固定的呀?

程序编译后的数据空间?
这句话不通。数据空间存放的是程序运行中不断变化的数,存放的数据量是由程序的运行状态决定的。楼主的意思是按不同的方式定义的数据,程序一开始运行时数据空间放了多少数据吗?数据存储器里的数一般是初始化数组、定义全局变量的初值这一类数,由定义时的前缀决定是否放数据寄存器。如果定义了data 或Xdata等,就把它放在数据空间。定义了code就放在程序空间。

Text(int a) 是两个字节呀,Text(char a)是一下字节

汗了,int 是0-65535 是两个8bit空间 ,char 是 0-255 (标准ascii)只要一个8bit空间

你想影响数据空间? 呵呵,写一个字符串 =“ABCDEFGXXXXXXXX”这个文字都是放到数据空间的

XDATA MEMORY 是片外RAM,当没有定义使用片外变量时就不会影响器大小,始终为零。
CODE MEMORY 应该为数据空间,当你为某个变量定义时(比如全局变量时),即使你没有给那个变量赋值,编译时也会给这一数据分配一个数据空间,正如你所说