當前位置:首頁 » 編程軟體 » 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。前者運算速度快於後者。

熱點內容
odbcforsqlserver 發布:2025-02-10 22:26:37 瀏覽:599
區塊鏈數據存儲在那裡 發布:2025-02-10 22:25:48 瀏覽:688
c語言for死循環 發布:2025-02-10 22:24:08 瀏覽:522
蘋果限制訪問初始密碼 發布:2025-02-10 22:21:31 瀏覽:758
為什麼安卓手機一年後卡頓 發布:2025-02-10 22:15:39 瀏覽:731
職工信息管理系統設計c語言 發布:2025-02-10 22:15:30 瀏覽:118
預演算法的理念 發布:2025-02-10 22:15:25 瀏覽:132
如何結合商圈顧客特點配置貨品 發布:2025-02-10 22:10:59 瀏覽:593
紙幣如何配置財富 發布:2025-02-10 22:00:57 瀏覽:706
資料庫中存放的是視圖的 發布:2025-02-10 21:57:46 瀏覽:628