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

熱點內容
高中生電腦編程培訓 發布:2025-03-15 03:11:04 瀏覽:48
蘋果和安卓5g哪個比較值得 發布:2025-03-15 03:05:11 瀏覽:904
台式電腦連接伺服器的線叫什麼線 發布:2025-03-15 03:02:21 瀏覽:979
python求餘弦 發布:2025-03-15 02:59:47 瀏覽:54
什麼叫伺服器域名 發布:2025-03-15 02:58:13 瀏覽:316
php框架實例 發布:2025-03-15 02:58:01 瀏覽:936
android結束子線程結束 發布:2025-03-15 02:49:24 瀏覽:860
北京理工大學伺服器ip 發布:2025-03-15 02:46:16 瀏覽:708
自動配置腳本怎麼刪除 發布:2025-03-15 02:46:11 瀏覽:809
國內唯一免費的雲伺服器 發布:2025-03-15 02:27:36 瀏覽:981