关于c51存储类型和其数据长度,有点不懂,求指点

如图,这些数据长度是是不是只是表示了一个范围,而不是他们固定就是这样的长度,比如code类型,我也可以这样定义:uchar code table[]={},表中的数据长度就是1个字节 , 我也可以这样定义:uint code talbe[]={}, 表中的数据长度就是2个字节,所以我就问下,就像上图中的长度是不 是只表示了长度范围,求指点

你上面的表格,可以说,是完全上的逻辑错误。
C语言,一个数据类型的长度只有以下几种:
unsigned char 或者 char 固定8位的长度,即一个字节
unsigned short 或者 short 固定16位长度,即两个字节
unsigned long 或者 long 固定 32位长度,即四个字节
float固定32位长度,即四个字节
double ,固定64位长度,即8个字节,但是在C51里,是32位,因为C51是把double转换成float来编译的。
另外还有union和struct,长度是不固定的。
在C51里扩展了bit类型,1个位的长度

长度,只取决与以上类型,与data,idata,bdata,xdata,pdata没有关系,所以,你上面的表格是错误的。

而那些data,idata,bdata,xdata,pdata等等,是变量或者常量的存储空间。

51单片机有以下几个内存模块组成:

ROM或者Flash就不说了。
RAM有------内部RAM的低128字节(00-7F)
-------内部RAM的高128字节(80-FF)---【89C51单片机没有这一段空间】
-------特殊功能寄存器(SFR)(80-FF)
------外部RAM 64K(0000-FFFF)

code表示是在Flash(ROM)中,是只读的。

data 表示的是内部RAM的低128字节,可以直接寻址,速度比较快

idata 表示内部RAM高128字节,只能是间接寻址,速度比data里的数据要慢。

pdata是外部RAM,也就是xdata中的前256个,也就是外部RAM中的00--FF,只能MOVX 间接寻址,但是,因为可以用R0做为指针,所以,速度与idata是一样的。

xdata是外部RAM的全部,也可以包括前256个,也就是说,外部RAM前256个,可以用pdata和xdata定义,都行,只能是MOVX 和 DPTR联合寻址,速度最慢。

详细内容,参考下面的链接:
http://zhidao.baidu.com/question/400032408?&oldq=1

举例:
data unsigned char a;//---放在内部RAM空间的低128字节,长度是8位
data unsigned short a;//---放在内部RAM空间的低128字节,长度是16位
data unsigned long a;//---放在内部RAM空间的低128字节,长度是32位

idata unsigned char a;//---放在内部RAM空间的高128字节,长度是8位
idata unsigned short a;//---放在内部RAM空间的高128字节,长度是16位
idata unsigned long a;//---放在内部RAM空间的高128字节,长度是32位

pdata unsigned char a;//---放在外部RAM空间的低256字节,长度是8位
pdata unsigned short a;//---放在外部RAM空间的低256字节,长度是16位
pdata unsigned long a;//---放在内部RAM空间的低256字节,长度是32位追问

您好,其实我也是看不懂这个表才问的,data,code,pdata。。。这些只是表示存储在那个地方,而这个表确实是我们教科书上有的,我不敢说书上的就全对,但编书的人总有他的意图,那么我就在想,他这个表里的数据长度是不是一个范围,而不是 固定的长度

追答

他这个表完全就是个错误啊,没有任何解释的意义。
data,code,pdata。。。这些只是表示存储在那个地方,至于数据的长度,不知道啊。

你不能说:data 的长度是 8bit,一字节,范围是 0-255,这根本就是不对的。
比如说,data unsigned long aaa,这个就是长度 32bit,4字节,范围是 0-4294967295.

因为完全不对,所以,你的问题我根本没法回答你。

就好像你问我,“一个石头的雌性还是雄性?” 一样,石头根本没有性别属性,我怎么回答你呢?

同样的data ,pdata,xdata这些根本就没有 “长度” 这一属性。
你问我,data 的长度是 8bit吗?你让我怎么回答你呢?

抱歉,我再补充一下:
如果换个角度,这个表也不是完全的错误,就是寻址的范围来看:
data 是片内RAM直接寻址,低128字节,在C语言里,编译器会自动扩展到内部RAM的高128字节的间接寻址,寻址用的寄存器是 8位寄存器R0,R1,所以,data 和 idata的寻址长度是 8bit,寻址的范围是 0-255

pdata的片外RAM的低256字节,寻址用的寄存器是 8位寄存器R0,R1,寻址长度是8bit,寻址的范围是 0-255

也就是说,data + idata 的空间最大只有 256个字节,pdata的空间最大也只有256字节。
如果你这样定义 :
data unsigned char aa[257] ;这就错了,因为超过了最大256的限定。
idata unsigned char aa[257] ;这就错了,因为超过了最大256的限定。
pdata unsigned char aa[257] ;这就错了,因为超过了最大256的限定。

而code 和 xdata 寻址用的寄存器是 16位寄存器DPTR,所以,寻址长度是8bit,寻址的范围是 0-65535
code 和 xdata 最大只有 65536个字节,注意,我说的是最大。
xdata unsigned char aa[65537] ;这就错了,因为超过了最大65536的限定。
code unsigned char aa[65537] ;这就错了,因为超过了最大65536的限定。

如果从 寻址范围这个角度上看,这个表格是对的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-07-15
题主的问题可能是这样的,就是说:uchar code table【】={这里面可以放多少个uchar}