当前位置:首页 » 编程软件 » small编译模式下定义变量

small编译模式下定义变量

发布时间: 2022-09-01 00:10:59

❶ 定义变量 占内存的多少

一个指针变量在内存中占两个字节(small模式编译
一个指针变量在内存中占四个字节(32位机器上)
一般都是32位机器的,所以四个字节咯。

❷ 51单片机定义变量时默认是存储到哪里的

未显式声明的情况下,变量会根据Memory Model的设置,默认分配在指定的存储区。

  • Small模式:默认分配在data区

  • Compact模式:默认分配在pdata区

  • Large模式:默认分配在xdata区

新建工程默认都是Small模式,所以未显式声明存储区域的变量都会分配在data区的。所以才会容易出现data区挤爆、编译器跳着脚让你把变量分到idata区去……

❸ C语言指针变量怎么能表示任何内存地址.

你用的是16位的编译器吧.(比如TC之类的)
你还没学汇编(或者计算机原理之类)的吧.

80X86CPU在16位模式下,地址是靠两个16位的2进制数表示的.就是 段地址 和偏移量 ,它们组合成20位的实地址能寻址1M的空间(具体怎么组合,有兴趣了自己在网上看看).

你选择的编译模式是small(TC默认的,Model Small),只有一个数据段.所以段地址固定不变(在程序运行时等于一个常数.不需要表示),所以
char *p;
sizeof(p)==2 (这是个16位的偏移量)

如果你把编译模式改成large或者huge
这个时候 char *p;
sizeof(p)就是 4 了,它包含了段地址和偏移量.

或者不管在什么模式下,你直接声明一个char far *p;
可以断定sizeof(p) 是4
这也是char near *p 和char far *p 的不同.
char far* 是包含段地址和偏移量,
char near* 则只有偏移量.

small 模式下,默认char * 就是char near*
而large模式下, 默认char * 就是 char far*
(near和far编译器帮你加上的)

段地址和偏移量组合后只有20位,所以在实模式下直接寻址只有1M空间.(注意是【直接】能寻到的空间)

如果你接触过dos(真正的dos而不是winxp下面的cmd),你就会知道,在没有扩展内存和扩充内存的情况下,总共可利用的内存只有1M(不管你的内存条是多少M的),寻址能力不行.
最后导致用户可以用的内存只有600K左右.

如果有兴趣的话,自己找点这方面的知识看看

❹ 为什么Keil C中idata不能用,是不是要在哪里设置一下

的确是RAM不够了,因为你没有把堆栈计算进去,所以虽然看起来小于256,但实际已经溢出。
从编译结果来看,你有好几个函数有实体但没有调用,这样是很浪费RAM的,因为KEIL因此会为这些函数中的局部变量都做了保留,相当于变成了全局变量来保存,如果你不想删除这些函数,那就教你个办法,在程序初始化阶段:
i=0;
if(i)
{
...
不需要调用的函数;
...
}
这样就能把RAM省下来了。
记住,嵌入式编程时,任何一个RAM空间都是十分宝贵的,可不能像PC程序那样用啊。一些对性能要求不高的变量,或使用不频繁的变量最好定义到XDATA中去。

❺ 关于单片机内存问题,DATA和XDATA具体是怎么样的

选择small 模式你定义的变量默认为data模式,即变量存放与单片机的内部ram,而large模式下,定义的变量存放于外部ram。前者运算速度快于后者。

热点内容
127小时ftp 发布:2025-02-11 09:47:10 浏览:851
安卓怎么看苹果手机的行驶轨迹 发布:2025-02-11 09:26:19 浏览:884
h板电影种子ftp 发布:2025-02-11 09:06:10 浏览:738
c语言数据类型定义 发布:2025-02-11 09:00:38 浏览:237
一个小时如何选择服务器 发布:2025-02-11 08:58:14 浏览:442
网易我的世界服务器推荐国服 发布:2025-02-11 08:56:34 浏览:241
电视父母锁屏密码应该会是什么 发布:2025-02-11 08:36:42 浏览:892
梅花适合用哪些植物进行配置 发布:2025-02-11 08:30:54 浏览:252
安卓手机如何像苹果一样弹窗 发布:2025-02-11 08:26:33 浏览:912
压缩文件扫码 发布:2025-02-11 08:20:55 浏览:258